美文网首页iOS专题iOS接下来要研究的知识点
iOS 多个标签自动适应屏幕宽并折行(类似于横向瀑布流)

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

作者: ZPCoder | 来源:发表于2016-11-24 09:35 被阅读940次

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


    屏幕快照 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高度的方法给我说说)
    求虐,求指点!!跪求!

    相关文章

      网友评论

      • 面具下的精灵:用预估高度加好约束,就可自适应了
      • 明月西楼_cd25:如果标签是可点击的 点击事件怎么添加啊 给个思路谢谢
        ZPCoder:你好 刚看到 可以用button当标签用啊 或者我没有完全理解你的意思。。。
      • 7997caf23048:缓存起来,刷新单个cell

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

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