美文网首页iOS
for循环创建几行排列居中的按钮

for循环创建几行排列居中的按钮

作者: CYC666 | 来源:发表于2016-08-04 09:25 被阅读182次
    这图片怎么那么难上传,简书得改

    看一下上面这图片,里边的按钮都是用for循环创建的,它们每一组都是居中对其,但是仔细观察的你又会发现每组又整体向左挪了一个像素,那是因为我计算的时候没吧layer描边的大小加上,所以,还是可以的啦。以下插代码解释:

    //-----------------------------------------------------记录X起点数组-----------------------------------------------------

    //这个数组存的是TagModel型数据,而TagModel里边存的是 

    @property (strong, nonatomic) NSArray *tagArray;

    //创建可变数组存储每一组的x起点

    NSMutableArray *tempArray = [NSMutableArray array];

    //记录每一组的字节数,通过字节数计算每组的起点

    NSInteger tempInt = 0;

    //循环遍历

    for (NSInteger i = 0; i<_tagArray.count; i++) {

    if (i%3 == 0 && i != 0 ) { //当到达下一组,记录当前组的起点位置,并字节数清零,刚开始时不算

    //当前组的起点 =(屏幕宽度 - 当前组组长)/2

    //当前组组长 = 字节数*10 + 每个按钮前后宽度*3个按钮 + 按钮几之间的空隙*2

    tempInt = (kScreenWidth - (tempInt*11+50*3+20*2))/2;   

    [tempArray addObject:[NSString stringWithFormat:@"%ld", tempInt]];

    tempInt = 0;

    }

    //因为tagArray数组中存的是TagModel

    TagModel *tagModel = _tagArray[i];

    //当前组字节数

    tempInt += tagModel.name.length;    

    if (i == _tagArray.count-1) {  //当已经是最后一个时,不必等到下一组,直接计算当前组的起点

    //当前组的起点 =(屏幕宽度 - 当前组组长)/2

    //当前组组长 = 字节数*11 + 每个按钮前后宽度*(_tagArray.count%3)个按钮 + 按钮几之间的空隙*(_tagArray.count%3-1)

    //我这里忽略了按钮Layer的描边宽度,所以看起来偏左一点点点点点点点点点点点点点点点点点点点点

    tempInt = (kScreenWidth - (tempInt*11+50*(_tagArray.count%3)+20*(_tagArray.count%3-1)))/2;

    //将当前组的X起点记录到可变数组中

    [tempArray addObject:[NSString stringWithFormat:@"%ld", tempInt]];

    }

    }

    //-----------------------------------------------------创建按钮-----------------------------------------------------

    //设定变量记录按钮位置,以便用它来设置下个Button的起点

    float temp = 0;

    //循环开始了,准备创建按钮

    for (NSInteger i = 0; i<_tagArray.count; i++) {

    TagModel *tagModel = _tagArray[i];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    if (i%3 == 0) {

    //设定每一组的起点,从上面已经存储了起点位置的数组中取出来

    temp = [tempArray[i/3] floatValue];

    }

    button.frame = CGRectMake(temp, 50+50*(i/3), 50+11*tagModel.name.length, 35);

    //当前按钮的起点由上一个按钮的位置确定,下一个按钮的起点由现在这个按钮大小确定

    temp += 50+10*tagModel.name.length + 20;

    //以下是按钮的属性基本设置,不是本文的重点了

    [button setTitle:tagModel.name forState:UIControlStateNormal];

    [button setTitleColor:[UIColor colorWithRed:154/255.0 green:154/255.0 blue:154/255.0 alpha:1] forState:UIControlStateNormal];

    button.titleLabel.font = [UIFont systemFontOfSize:14];

    button.layer.cornerRadius = 17.5;

    button.layer.borderWidth = 1;

    button.layer.borderColor = [UIColor colorWithRed:154/255.0 green:154/255.0 blue:154/255.0 alpha:.3].CGColor;

    [button addTarget:self action:@selector(tagButtonAction:) forControlEvents:UIControlEventTouchUpInside];

    [tagScrollView addSubview:button];

    }

    提问:我PS玩得还可以,本组做的项目图片,我都可以用PS精确提取出来,而且速度还蛮快的,不必美工差。这样一个熟练iOS也擅长使用PS的淫才,公司会更喜欢吗?

    相关文章

      网友评论

      • dlxfly:for循环创建按钮 但是按钮的个数不确定 是从网络请求的 请求后怎么刷新按钮个数?
        CYC666:@dlxfly 这个问题问得好。先请求网络数据,再for循环创建,刷新就移除原先的按钮,重新创建,表视图reloaddata在这不可用。

      本文标题:for循环创建几行排列居中的按钮

      本文链接:https://www.haomeiwen.com/subject/cjrpdttx.html