iOS学习—表情的排列


MJ大神的表情排列,加上自己写的增加表情功能,不过还有点小bug(bug已经解决)

//
//  ViewController.m
//  表情排列
//
//  Created by on 15/4/15.
//  Copyright (c) 2015年 apple. All rights reserved.
//
 
#import "ViewController.h"
 
#define kImageWidth 40
 
@interface ViewController ()
 
{
    UIButton *_addImage;
    NSInteger _imageCount;
    NSInteger _columns;
    NSInteger _col;
    NSInteger _row;
    CGFloat _oneX;
    CGFloat _oneY;
    CGFloat _margin;
}
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    _imageCount = 9;
    [self changePointOfImage:2];
}
 
- (void)addImage:(NSString *)imageName pointX:(NSInteger)x pointY:(NSInteger)y {
    UIImageView *faceView = [[UIImageView alloc] initWithFrame:CGRectMake(x, y, kImageWidth, kImageWidth)];
    faceView.image = [UIImage imageNamed:imageName];
    [self.view addSubview:faceView];
}
 
- (void)changePointOfImage:(NSInteger)currentColumns {
 
    _columns = currentColumns;
     
    _margin = (self.view.frame.size.width - currentColumns * kImageWidth) / (currentColumns + 1);
    _oneX = _margin;
    _oneY = 120;
     
    for (NSInteger i = 0; i <= _imageCount; i++) {
        _col = i % currentColumns;  // 列数
        _row = i / currentColumns;  // 行数
         
        CGFloat x = _oneX + _col * (kImageWidth + _margin);
        CGFloat y = _oneY + _row * (kImageWidth + _margin);
         
        if (self.view.subviews.count == 4 + _imageCount) {
            UIView *temp = self.view.subviews[i + 3];
            CGRect frame = temp.frame;
            frame.origin = CGPointMake(x, y);
            temp.frame = frame;
        } else if (i == _imageCount) {
            _addImage = [UIButton buttonWithType:UIButtonTypeContactAdd];
            [_addImage addTarget:self action:@selector(addFaceImage) forControlEvents:UIControlEventTouchUpInside];
            _addImage.frame = CGRectMake(x, y, kImageWidth, kImageWidth);
            [self.view addSubview:_addImage];
        } else {
            NSInteger imageIndex = i % 9;
            NSString *imageName = [NSString stringWithFormat:@"01%ld.png", imageIndex];
            [self addImage:imageName pointX:x pointY:y];
        }
    }
}
 
- (void)addFaceImage {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
     
    _imageCount++;
    NSInteger newIndex = _imageCount % 9;
    NSString *imageName = [NSString stringWithFormat:@"01%ld.png", newIndex];
     
    CGFloat x = _addImage.frame.origin.x;
    CGFloat y = _addImage.frame.origin.y;
     
    [self addImage:imageName pointX:x pointY:y];
     
    _col = _imageCount % _columns; 
    _row = _imageCount / _columns;
     
    CGRect frame = _addImage.frame;
    frame.origin.x = _oneX + _col * (kImageWidth + _margin);
    frame.origin.y = _oneY + _row * (kImageWidth + _margin);
    _addImage.frame = frame;
     
    [UIView commitAnimations];
}
 
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
 
- (IBAction)segmentedChoose:(UISegmentedControl *)sender {
     
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
     
    NSInteger selectCol = sender.selectedSegmentIndex + 2;
    [self changePointOfImage:selectCol];
     
    [UIView commitAnimations];
}
@end

bug说明:

当添加过表情后再排序,就会发现,添加按钮跑到前面去了。如图:

运行截图-1

原因:因为subviews是一个NSArray,添加的表情就会自动的添加到subviews的后面,也就是添加按钮不位于最上层,即subviews的NSArray的末尾。那么循环排序的时候,添加按钮就一直在第十个的位置。

解决方法:将添加表情按钮置于最顶层即可。

在addFaceImage方法中添加

[self.view bringSubviewToFront:_addImage];

修改后的代码如下:

- (void)addFaceImage {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
     
    _imageCount++;
    NSInteger newIndex = _imageCount % 9;
    NSString *imageName = [NSString stringWithFormat:@"01%ld.png", newIndex];
     
    CGFloat x = _addImage.frame.origin.x;
    CGFloat y = _addImage.frame.origin.y;
     
    [self addImage:imageName pointX:x pointY:y];
     
    _col = _imageCount % _columns; 
    _row = _imageCount / _columns;
     
    CGRect frame = _addImage.frame;
    frame.origin.x = _oneX + _col * (kImageWidth + _margin);
    frame.origin.y = _oneY + _row * (kImageWidth + _margin);
    _addImage.frame = frame;
     
    [self.view bringSubviewToFront:_addImage];
     
    [UIView commitAnimations];
}

效果如下:

运行截图-2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,229评论 4 61
  • 时间过得好快,感觉刚做了班级周检视,又开始小组周检视,总要开会的样子。 可是,时间对谁都是一样的,如何利用时间,就...
    扎高拉姆阅读 152评论 0 0
  • 今天就是除夕,回家也有两天了,一直都有点身不由己,琐事缠身。直到拿起书和笔,直到母亲说起以往,才摆脱俗世,才有家的...
    野鸟阅读 449评论 0 0
  • 1. 安排充电时刻 算一算进小灶群现在也有五个月了,从进来后就开始读书写作。如果以平均每天花一小时阅读一小时写作,...
    Janet大昕鼓徵阅读 203评论 0 6
  • ​1.“我们散了吧……” 当鑫雨说出这句话的时候,心情是释然的。相识超过5年,恋爱不满一年。很奇怪,本应甜美的恋爱...
    刘二丫儿阅读 296评论 0 0