iOS专题iOS接下来要研究的知识点

iOS 多个标签自动适应屏幕宽并折行(类似于横向瀑布流)

2016-11-24  本文已影响940人  ZPCoder

先看效果(数据都是为了测试,别在意哈☺)


屏幕快照 2016-11-24 09.03.51.png

因为我这是在一个cell里面做的,并且得让他随着数据的多少自动适应高度(也就是说数据显示出来多高,cell就得创建多高,但这是个悖论, 因为cell创建好了就没法改变高度,但这些标签是cell创建好了才乐意传数据进去创建,烧了我好多脑细胞),好了不多说了,showtime。

cell的.h

@interface WartFallTableViewCell : UITableViewCell

-(void)setCellWithArr:(NSArray *)arr;

@end

这没什么可说的

cell的.m

@implementation WartFulTableViewCell

- (void)awakeFromNib {
    [super awakeFromNib];
   
    
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    
}
//关键方法(其实思路理清楚就不难)

-(void)setCellWithArr:(NSArray *)arr{
   
    CGFloat H_distance = autoScaleH(15.0f);//间距——高
    CGFloat W_distance = autoScaleW(13.0f);//间距——宽
    
    CGFloat sum_w = W_distance;//总宽
    CGFloat sum_h = 0;//总高
    CGFloat one_width = kScreenWidth/2/10.0f;//一个字符所占宽度
    CGFloat sum_w_befor = sum_w;
       for (int i = 0; i<arr.count; i++) {
           //这是随机边框的颜色
           NSInteger j = arc4random()%4;

               UIColor *bordercolor = kBlueColor;
        switch (j) {
            case 1:
                bordercolor = kBlueColor;
                break;
            case 2:
                bordercolor = kYellowColor;
                break;
            case 3:
                bordercolor = kRedColor;
                break;
                
            default:
                break;
        }
           //提取数据的大小
        NSString *str = arr[i];
        NSInteger numberOfStr = str.length;
        //把标签的宽度加入总宽中
        sum_w_befor = sum_w;//没有累加前的总宽,为了给label赋位置。
        sum_w += W_distance + numberOfStr*one_width;//累加后的宽为了判断是否折行。

        if (sum_w>kScreenWidth) {//如果宽度超过了屏幕宽 则折行
            sum_w = W_distance;
            sum_w_befor = sum_w;
          sum_w += W_distance + numberOfStr*one_width;//折行后数据的处理(难点,少了我不少脑细胞)
            sum_h+= H_distance+autoScaleH(30);
            
        }
           
         UILabel *textLabl = [[UILabel alloc]initWithFrame:CGRectMake(sum_w_befor, sum_h+H_distance,numberOfStr*one_width, autoScaleH(30))];
        textLabl.textAlignment = NSTextAlignmentCenter;
        textLabl.layer.cornerRadius = autoScaleH(12);
        textLabl.layer.masksToBounds = YES;
        textLabl.layer.borderWidth = 1;
        textLabl.layer.borderColor =bordercolor.CGColor;
        textLabl.font = [UIFont systemFontOfSize:autoScaleW(15)];
        textLabl.text = str;
        [self addSubview:textLabl];
        
    }
    sum_h+=H_distance+H_distance+autoScaleH(30);
    //  以下两行是我为了让cell自动适应试的各种方法,但并没什么卵用。
    //self.backLabelHeight.constant = sum_h;   //这是我用xib做的一个label的约束拉出来的但cell创建以后改变约束并没有什么效果了。
//    self.cellHeight = sum_h;//这是我给他添加的类目。(这个方法为了配合这个表里边的其他cell,因为其他cell都是拉约束高度自适应的,宝宝心里苦啊,就这个cell不行)
}

看了上面代码,其实关键的已经完了,但有一个坑就是cell高度不能随着数据的多少自适应,所以只能在UITableView的代理里边设定了(蛋疼!!!)

这是创建的部分

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
   WartFulTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"WartFulTableViewCell" forIndexPath:indexPath];
// 这些都是痛啊
//        cell = [[WartFulTableViewCell alloc]initWithArr:self.dataModel.yach_project];
        [cell setCellWithArr:self.dataModel.yach_project];

        return cell;

}

这是返回高度的 在这里再计算一遍(其实也可以用代理传回来,但我懒的用,直接代码复制过来。。。囧!)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    CGFloat H_distance = autoScaleH(15.0f);//间距——高
        CGFloat W_distance = autoScaleW(13.0f);//间距——宽
        
        CGFloat sum_w = 0;//总宽
        CGFloat sum_h = H_distance+autoScaleH(30);//总高
        CGFloat one_width = kScreenWidth/2/10.0f;//一个字符所占宽度
        
        for (int i = 0; i<self.dataModel.yach_project.count; i++) {
            
            NSString *str = self.dataModel.yach_project[i];
            NSInteger numberOfStr = str.length;
            sum_w+=W_distance + numberOfStr*one_width;//累加后的宽为了判断是否折行。
            if (sum_w>kScreenWidth) {//如果宽度超过了屏幕宽 则折行
                sum_w = W_distance;
                sum_w += W_distance + numberOfStr*one_width;
                sum_h+= H_distance+autoScaleH(30);
                
            }
            
            
        }
        
        sum_h+=H_distance;
        
        return sum_h;
}

到此结束了,心碎之旅!(对了,哪位大神,知道cell创建以后,再修改cell高度的方法给我说说)
求虐,求指点!!跪求!

上一篇下一篇

猜你喜欢

热点阅读