IOS實現(xiàn)分組單選,多選迹辐,標(biāo)簽流

圖片

因在項目中多次遇到了單選蝶防,多選的需求,所以在這里總結(jié)下明吩,以便下次可以有個參考或者直接可以用的间学。

swift版

在DEMO中主要實現(xiàn)了以下功能
  • 分組,按鈕布局自適應(yīng)文字大小
  • 單選多選印荔,每個組分別設(shè)置單選多選
  • 設(shè)置默認選擇項

分組是根據(jù)每個組的 titleArr 來判斷的低葫,
傳入數(shù)據(jù)源
- (void)setContentView:(NSArray *)contenArr titleArr:(NSArray *)titleArr

進行分組
for (NSInteger i = 0 ; i < titleArr.count; ++i) {
        //設(shè)置默認的值,使保存值的數(shù)組是按照group的順序來保存仍律,便于后面對相應(yīng)的group的值進行增改
        [self.saveSelButValueArr addObject:@""];
        [self.saveGroupIndexArr addObject:@""];
        //設(shè)置每一組的值嘿悬,并返回最后一個frame
         @autoreleasepool {
             self.frameRect = [self setSignView:contenArr[i] andTitle:titleArr[i] andFrame:self.frameRect andGroupId:i];
         }
    }
設(shè)置滾動視圖的滾動范圍
    self.scroller.contentSize = CGSizeMake(0, self.frameRect.size.height + self.frameRect.origin.y + 10);
文字自適應(yīng)
 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;
設(shè)置默認選中
//設(shè)置默認選擇
            if (_isDefaultSel) {
                 NSString *valueStr = [NSString stringWithFormat:@"%ld/%@",i,dataAr[i]];
                //設(shè)置默認選擇以數(shù)組形式,則存在多選
                if (_defaultSelectIndexArr.count > 0) {
                    //每個組單獨設(shè)置默認選中值
                    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{
                    //統(tǒng)一設(shè)置默認選擇值
                    if (i == _defaultSelectIndex) {
                        but.backgroundColor = _selColor;
                        but.selected = YES;
                        //保存默認選中按鈕的值
                        if (_singleFlagArr.count > 0) {
                            //為每個組設(shè)置單選還是多選
                            [self.saveSelButValueArr replaceObjectAtIndex:groupId withObject:[_singleFlagArr[groupId] isEqual:@0] ? @[valueStr] : valueStr];
                        }else{
                            [self.saveSelButValueArr replaceObjectAtIndex:groupId withObject:_isSingle ? valueStr : @[valueStr]];
                        }
                    }
                }
單選水泉,多選
//多選善涨,主要是將選中的值保存到數(shù)組里
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];
        }
//單選窒盐,用循環(huán)方式,確保每個單選組的都只有一個選中钢拧,不存在多個選中
 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;
            }
        //取出當(dāng)前所在的組的一條數(shù)據(jù)蟹漓,因為單選,所以就只有一條數(shù)據(jù), 并拼接當(dāng)前選擇的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;
}

記錄到此結(jié)束源内,代碼簡單葡粒。
DEMO-GitHub-地址
DEMO-Bitbucket-地址

swift版
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膜钓,隨后出現(xiàn)的幾起案子嗽交,更是在濱河造成了極大的恐慌,老刑警劉巖呻此,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腔寡,居然都是意外死亡焚鲜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門放前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忿磅,“玉大人,你說我怎么就攤上這事凭语〈兴” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵似扔,是天一觀的道長吨些。 經(jīng)常有香客問我,道長炒辉,這世上最難降的妖魔是什么豪墅? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮黔寇,結(jié)果婚禮上偶器,老公的妹妹穿的比我還像新娘。我一直安慰自己缝裤,他們只是感情好屏轰,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憋飞,像睡著了一般霎苗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榛做,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天叨粘,我揣著相機與錄音猾编,去河邊找鬼。 笑死升敲,一個胖子當(dāng)著我的面吹牛答倡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驴党,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼瘪撇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了港庄?” 一聲冷哼從身側(cè)響起倔既,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹏氧,沒想到半個月后渤涌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡把还,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年实蓬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吊履。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡安皱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艇炎,到底是詐尸還是另有隱情酌伊,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布缀踪,位于F島的核電站居砖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驴娃。R本人自食惡果不足惜悯蝉,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望托慨。 院中可真熱鬧鼻由,春花似錦、人聲如沸厚棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婆硬。三九已至狠轻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彬犯,已是汗流浹背向楼。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工查吊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湖蜕。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓逻卖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昭抒。 傳聞我的和親對象是個殘疾皇子评也,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345