iOS多級展開列表的實現(xiàn)

iOS多級展開列表的實現(xiàn)

效果圖

multTableView.gif

用法(類似UITableView)

初始化XDMultTableView

#import "XDMultTableView.h"
...
@property(nonatomic, readwrite, strong)XDMultTableView *tableView;

 _tableView = [[XDMultTableView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height-64)];
    _tableView.openSectionArray = [NSArray arrayWithObjects:@1,@2, nil];
    _tableView.delegate = self;
    _tableView.datasource = self;
    _tableView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_tableView];

實現(xiàn)數(shù)據(jù)源


- (NSInteger)mTableView:(XDMultTableView *)mTableView numberOfRowsInSection:(NSInteger)section{
    return 5;
}

- (XDMultTableViewCell *)mTableView:(XDMultTableView *)mTableView
              cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIdentifier = @"cell";
    UITableViewCell *cell = [mTableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    UIView *view = [[UIView alloc] initWithFrame:cell.bounds] ;
    view.layer.backgroundColor  = [UIColor whiteColor].CGColor;
    view.layer.masksToBounds    = YES;
    view.layer.borderWidth      = 0.3;
    view.layer.borderColor      = [UIColor lightGrayColor].CGColor;
    
    cell.backgroundView = view;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    return cell;
}

- (NSInteger)numberOfSectionsInTableView:(XDMultTableView *)mTableView{
    return 6;
}

-(NSString *)mTableView:(XDMultTableView *)mTableView titleForHeaderInSection:(NSInteger)section{
    return @"我是頭部";
}

實現(xiàn)代理


- (CGFloat)mTableView:(XDMultTableView *)mTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 50;
}

- (CGFloat)mTableView:(XDMultTableView *)mTableView heightForHeaderInSection:(NSInteger)section{
    return 40;
}

- (void)mTableView:(XDMultTableView *)mTableView willOpenHeaderAtSection:(NSInteger)section{
    NSLog(@"即將展開");
}

- (void)mTableView:(XDMultTableView *)mTableView willCloseHeaderAtSection:(NSInteger)section{
    NSLog(@"即將關(guān)閉");
}

- (void)mTableView:(XDMultTableView *)mTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"點擊cell");
}

列表展開關(guān)閉的實現(xiàn)原理

在section header注冊一個手勢

//section header view 設(shè)置tag值為section
view.tag = section;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHeader:)];
    [view addGestureRecognizer:tap];
  

手勢的響應(yīng)事件


- (void)tapHeader:(UITapGestureRecognizer *) tap {
    NSInteger section = tap.view.tag;
    NSNumber *sectionObj = [NSNumber numberWithInteger:section];
    UIImageView *imageView = (UIImageView *)[tap.view viewWithTag:100];
    //_multopenSectionArray 用于記錄每個 section的展開和關(guān)閉狀態(tài)
    if ([_multopenSectionArray containsObject:sectionObj]) {
        NSArray *deleteArray = [self buildDeleteRowWithSection:section];
        [_multopenSectionArray removeObject:sectionObj];
        //想關(guān)閉的section的所有indexPath
        [_tableView deleteRowsAtIndexPaths:deleteArray withRowAnimation:UITableViewRowAnimationFade];
        [UIView animateWithDuration:0.3 animations:^{
            imageView.transform = CGAffineTransformMakeRotation(-M_PI/2);
        }];
    }else{
        [_multopenSectionArray addObject:sectionObj];
        //想展開的section的所有indexPath
        NSArray *insertArray = [self buildInsertRowWithSection:section];
        [_tableView insertRowsAtIndexPaths:insertArray withRowAnimation:UITableViewRowAnimationFade];
        [UIView animateWithDuration:0.3 animations:^{
            imageView.transform = CGAffineTransformMakeRotation(0);
        }];
    }
}

源碼地址:https://github.com/caixindong/XDMultTableView

想了解更多iOS相關(guān)知識笑跛,歡迎訂閱我的小專欄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市简软,隨后出現(xiàn)的幾起案子刊愚,更是在濱河造成了極大的恐慌欺冀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衡创,居然都是意外死亡勘高,警方通過查閱死者的電腦和手機(jī)峡蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來华望,“玉大人层亿,你說我怎么就攤上這事×⒚溃” “怎么了匿又?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長建蹄。 經(jīng)常有香客問我碌更,道長,這世上最難降的妖魔是什么洞慎? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任痛单,我火速辦了婚禮,結(jié)果婚禮上劲腿,老公的妹妹穿的比我還像新娘旭绒。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布挥吵。 她就那樣靜靜地躺著重父,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忽匈。 梳的紋絲不亂的頭發(fā)上房午,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音丹允,去河邊找鬼郭厌。 笑死,一個胖子當(dāng)著我的面吹牛雕蔽,可吹牛的內(nèi)容都是我干的折柠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼批狐,長吁一口氣:“原來是場噩夢啊……” “哼液走!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贾陷,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缘眶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后髓废,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巷懈,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年慌洪,在試婚紗的時候發(fā)現(xiàn)自己被綠了顶燕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡冈爹,死狀恐怖涌攻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情频伤,我是刑警寧澤恳谎,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站憋肖,受9級特大地震影響因痛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岸更,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一鸵膏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怎炊,春花似錦谭企、人聲如沸廓译。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽非区。三九已至,卻和暖如春攀操,著一層夾襖步出監(jiān)牢的瞬間院仿,已是汗流浹背秸抚。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工速和, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剥汤。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓颠放,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吭敢。 傳聞我的和親對象是個殘疾皇子碰凶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容