美文网首页
IOS实现分组单选,多选,标签流

IOS实现分组单选,多选,标签流

作者: zrock_chen | 来源:发表于2018-08-10 16:15 被阅读0次
图片

因在项目中多次遇到了单选,多选的需求,所以在这里总结下,以便下次可以有个参考或者直接可以用的。

swift版

在DEMO中主要实现了以下功能
  • 分组,按钮布局自适应文字大小
  • 单选多选,每个组分别设置单选多选
  • 设置默认选择项

分组是根据每个组的 titleArr 来判断的,
传入数据源
- (void)setContentView:(NSArray *)contenArr titleArr:(NSArray *)titleArr

进行分组
for (NSInteger i = 0 ; i < titleArr.count; ++i) {
        //设置默认的值,使保存值的数组是按照group的顺序来保存,便于后面对相应的group的值进行增改
        [self.saveSelButValueArr addObject:@""];
        [self.saveGroupIndexArr addObject:@""];
        //设置每一组的值,并返回最后一个frame
         @autoreleasepool {
             self.frameRect = [self setSignView:contenArr[i] andTitle:titleArr[i] andFrame:self.frameRect andGroupId:i];
         }
    }
设置滚动视图的滚动范围
    self.scroller.contentSize = CGSizeMake(0, self.frameRect.size.height + self.frameRect.origin.y + 10);
文字自适应
 CGFloat butWidth = contentSize.width + 20;
 butorignX = alineButWidth + _maragin_x;
 alineButWidth = _maragin_x + butWidth + alineButWidth;
if (alineButWidth >= self.width) {
      butorignX = _maragin_x;
      alineButWidth = butorignX + butWidth;
      but_totalHeight = current_rect.size.height + current_rect.origin.y + _maragin_y;
   }
  but.frame = CGRectMake(butorignX, but_totalHeight, butWidth, butHeight);
  current_rect = but.frame;
设置默认选中
//设置默认选择
            if (_isDefaultSel) {
                 NSString *valueStr = [NSString stringWithFormat:@"%ld/%@",i,dataAr[i]];
                //设置默认选择以数组形式,则存在多选
                if (_defaultSelectIndexArr.count > 0) {
                    //每个组单独设置默认选中值
                    NSArray * selIndexArr = nil;
                    NSNumber * indexNumber = nil;
                    [_defaultSelectIndexArr[groupId] isKindOfClass:[NSArray class]] ? (selIndexArr = _defaultSelectIndexArr[groupId]) : (indexNumber = _defaultSelectIndexArr[groupId]);
                    if (selIndexArr.count > 0) {
                        for (NSNumber * selIndex in selIndexArr) {
                            if (i == [selIndex integerValue]) {
                                but.selected = YES;
                                but.backgroundColor = _selColor;
                                [tempSelArr addObject:valueStr];
                                break;
                            }
                        }
                    }else{
                        if (i == [indexNumber integerValue]) {
                            but.selected = YES;
                            [tempSelArr addObject:valueStr];
                            but.backgroundColor = _selColor;
                        }
                    }

                }else{
                    //统一设置默认选择值
                    if (i == _defaultSelectIndex) {
                        but.backgroundColor = _selColor;
                        but.selected = YES;
                        //保存默认选中按钮的值
                        if (_singleFlagArr.count > 0) {
                            //为每个组设置单选还是多选
                            [self.saveSelButValueArr replaceObjectAtIndex:groupId withObject:[_singleFlagArr[groupId] isEqual:@0] ? @[valueStr] : valueStr];
                        }else{
                            [self.saveSelButValueArr replaceObjectAtIndex:groupId withObject:_isSingle ? valueStr : @[valueStr]];
                        }
                    }
                }
单选,多选
//多选,主要是将选中的值保存到数组里
valueStr = [NSString stringWithFormat:@"%ld/%@",sender.tag % 100 - 1,self.dataSourceArr[sender.tag / 100][sender.tag % 100 - 1]];
        sender.backgroundColor = _selColor;
        if (![tempSaveArr containsObject:valueStr]) {
            [tempSaveArr addObject:valueStr];
        }else{
            [tempSaveArr replaceObjectAtIndex:sender.tag % 100 - 1 withObject:valueStr];
        }
//单选,用循环方式,确保每个单选组的都只有一个选中,不存在多个选中
 for (NSInteger i = 0; i < [self.dataSourceArr[sender.tag / 100] count]; ++i) {
                if (sender.tag % 100 ==  i + 1) {
                    sender.selected = YES;
                    sender.backgroundColor = _selColor;
                    continue;
                }
                UIButton *but = (UIButton *)[self.scroller viewWithTag:(sender.tag / 100) * 100 + i + 1];
                but.selected = NO;
                but.backgroundColor = _norColor;
            }
        //取出当前所在的组的一条数据,因为单选,所以就只有一条数据, 并拼接当前选择的Index
       valueStr = [NSString stringWithFormat:@"%ld/%@",sender.tag % 100 - 1,self.dataSourceArr[sender.tag / 100][sender.tag % 100 - 1]];
计算文字宽度
- (CGSize)sizeWithWidth:(NSString *)text font:(UIFont *)font maxHeight:(CGFloat)height{
    NSMutableDictionary *attrDict = [NSMutableDictionary dictionary];
    attrDict[NSFontAttributeName] = font;
    CGSize size = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, height) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrDict context:nil].size;
    return size;
}

记录到此结束,代码简单。
DEMO-GitHub-地址
DEMO-Bitbucket-地址

swift版

相关文章

  • IOS实现分组单选,多选,标签流

    因在项目中多次遇到了单选,多选的需求,所以在这里总结下,以便下次可以有个参考或者直接可以用的。 swift版 在D...

  • swift实现分组单选,多选,标签流

    因在项目中多次遇到了单选,多选的需求,所以在这里总结下,以便下次可以有个参考或者直接可以用的。 OC版 在DEMO...

  • 2017-12-27

    IOS轻松搞定button单选,多选,反选标签 (1)创建KKTipView继承于UIView .h文件内容 //...

  • 单选以及多选的实现 iOS

    话不多说,首先看效果图 1、定义UIView的扩展类 UIView+DBExtension.h import

  • 单选以及多选的实现 iOS

    话不多说,首先看效果图 请点击此处输入图片描述 单选.gif 请点击此处输入图片描述 多选.gif 1、定义UIV...

  • iOS tableView实现单选和多选

    今天在项目中遇到了tableView的单选需求,现在总结一下,用一个简单的demo实现了简单的单选和多选两个功能....

  • iOS tableView实现单选和多选

    今天在项目中遇到了tableView的单选需求,现在总结一下,用一个简单的demo实现了简单的单选和多选两个功能....

  • CheckedTextView

    CheckedTextView的使用(结合ListView实现单选、多选效果)

  • 瓜皮🍉

    title: 瓜皮 ListView中使用checkbox实现单选、多选等

  • HTML 表单的用法

    :表单 :标签 :输入text:输入文本password:输入密码checkbox:多选radio:单选file:...

网友评论

      本文标题:IOS实现分组单选,多选,标签流

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