美文网首页iOS常用
iOS 常见分组标签视图

iOS 常见分组标签视图

作者: 浅浅_e90e | 来源:发表于2021-05-27 10:13 被阅读0次

    开发中常遇到根据服务器返回的数据去创建很多可点击的小标签。如下面这种样式的


    image.png

    一般这种样式的数据格式都是数组中放模型,模型类中的一个属性还是个数组,数组中存放的是另一个模型类对象。
    遇到这种样式,因为外层数组个数不固定,所以分区数也不固定,一般思路是用tableView的group样式去创建,但也可以用UIScrollView去遍历两层数组创建,我这里是用for循环遍历数组创建标签到UIScrollView上。
    先在创建页面控件的方法里创建UIScrollView对象mainScr,设置好相关属性和frame,等服务器返回的数据解析成模型类以后,再调用下面的子视图创建的方法,遍历两层模型数组,创建标签,添加到mainScr上面
    我这里用自己模拟的一些数据创建的视图,模拟数据格式如下,写的不怎么规范,凑合看吧:

    image.png
      int View_Top = 10;  //分区视图的y顶点
      int View_Gap = 15; // 每个分区视图之间的间距
       int left_gap = 10; //分区视图左侧距离父视图mainScr的距离
        for(int i=0;i<dicArr.count;i++) {
            NSDictionary *Dic = dicArr[i];
            //========== 创建分区的背景视图=====================
            UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(left_gap, View_Top, ScreenWith-2*left_gap, 10)];
            [mainScr addSubview:backView];
    
            //分区的标题中的图片
            UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 20, 20)];
            imgV.backgroundColor = [UIColor redColor];
            [backView addSubview:imgV];
            
          //分区标题中的文字
            UILabel *titleL = [[UILabel alloc] initWithFrame:CGRectMake(imgV.right+5, imgV.top, backView.width-45, 20)];
            titleL.text = Dic[@"title"];
            titleL.font = [UIFont systemFontOfSize:15];
            [backView addSubview:titleL];
            
          //分区中的小标签所在的视图
            UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(left_gap, titleL.bottom+10, backView.width-2*left_gap, 10)];
            [backView addSubview:subView];
            
            ///============创建分区的标签视图===============
            
            int btn_left = 10;      //标签按钮的x顶点
            int btn_top = 10;       //标签按钮的y顶点
            int btn_height = 25;    //标签按钮的高度
            int btn_gap = 10;       //标签按钮上下和左右的间距
            NSArray *detailArr = Dic[@"tagArr"];
            NSMutableArray *btnArr = [NSMutableArray array];
            for(int j=0;j<detailArr.count;j++) {
                NSDictionary *dic = detailArr[j];
                ///按标签文字的长度计算出标签的宽度
                int w = [CommonTools stringwidthfor:dic[@"tagStr"] font:[UIFont systemFontOfSize:13]]+30;
                //如果即将要创建的标签的左顶点超出父视图,则换行
                if(btn_left + w + btn_gap > subView.width) { 
                    btn_left = 10;
                    btn_top = btn_top + btn_gap + btn_height;
                }
                
                UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(btn_left, btn_top, w, btn_height)];
                [btn setTitle:dic[@"tagStr"] forState:UIControlStateNormal];
                [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
                btn.layer.borderColor = [UIColor blueColor].CGColor;
                btn.layer.borderWidth = 1;
                btn.clipsToBounds = YES;
                btn.selected = NO;
                btn.layer.cornerRadius = btn_height/2;
                btn.titleLabel.font = [UIFont systemFontOfSize:13];
                [btn addTarget:self action:@selector(clickTag:) forControlEvents:UIControlEventTouchUpInside];
                [subView addSubview:btn];
    
                //改变标签的左顶点位置
                btn_left = btn_left + btn_gap + w;  
                //改变标签视图的高度 
                subView.height = btn_top + btn_height + btn_gap;
                
                [btnArr addObject:btn];
            }
    
           //根据分类项目的id将标签存储到对应的数组,以便后续处理标签的单选多选逻辑
            if([Dic[@"cate_id"] isEqualToString:@"0"]) {
                sexArray = btnArr; 
            }else if([Dic[@"cate_id"] isEqualToString:@"1"]) {
                ageArray = btnArr;
            }else if([Dic[@"cate_id"] isEqualToString:@"2"]) {
                drugArray = btnArr;
            }else if([Dic[@"cate_id"] isEqualToString:@"3"]) {
                getArray = btnArr;
            }
           //分区视图的顶部放titleL和imageV的间距
            int subView_top = 10+20+10;
            //根据标签视图的高度,计算分区背景视图的高度
            backView.height = subView_top + subView.height + View_Gap;
            //改变一下分区视图的y顶点值
            View_Top = backView.bottom+10;
        }
        //当所有子视图都创建完成,改变mainScr的contentSize
        mainScr.contentSize = CGSizeMake(ScreenWith, View_Top);
    

    UIScrollView创建标签视图的好处是代码简洁,不用处理很多代理方法,记性不好,常用功能记录一下。
    代码如有处理不当之处,烦请看这篇文章的小可爱们指正一下~

    相关文章

      网友评论

        本文标题:iOS 常见分组标签视图

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