使用UItableview實(shí)現(xiàn)展開(kāi)折疊效果,話(huà)不多說(shuō),先看一下運(yùn)行效果:
講一下實(shí)現(xiàn)的大概思路:
- 自定義每個(gè)section的headerView,并且給headerView添加tap手勢(shì).
- 在tap觸發(fā)的方法中判斷當(dāng)前點(diǎn)擊的section狀態(tài),然后調(diào)用*- (void)reloadSections:(NSIndexSet )sections withRowAnimation:方法刷新section.
幾個(gè)關(guān)鍵的地方:
1.在點(diǎn)擊section的時(shí)候,需要判斷當(dāng)前點(diǎn)擊的section的狀態(tài)是展開(kāi)還是關(guān)閉.我用的方法是創(chuàng)建了一個(gè)NSMutableArray,在這個(gè)數(shù)組中添加和section的count相同的元素,這里我存放的就是0和1的字符串,0代表關(guān)閉,1代表展開(kāi),代碼如下:
for (NSInteger i = 0; i < _provinceArray.count; i++) {
[_isExpandArray addObject:@"0"];//0:沒(méi)展開(kāi) 1:展開(kāi)
}
如果你有更好的方法,可以留言告訴我一下,謝謝~
2.在numberOfRowsInSection這個(gè)方法中,需要根據(jù)標(biāo)識(shí),來(lái)決定每個(gè)section中row的個(gè)數(shù),記住,千萬(wàn)不要寫(xiě)死了.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if ([_isExpandArray[section]isEqualToString:@"1"]) {
NSString *keyProvince = _provinceArray[section];
NSArray *cityArray = [_provinceDic objectForKey:keyProvince];
return cityArray.count;
}else{
return 0;
}
}
3.最后一個(gè)比較關(guān)鍵的點(diǎn)就是tap手勢(shì)所觸發(fā)的方法,這個(gè)方法主要做兩件事:首先要判斷section的狀態(tài),更改小三角形的圖標(biāo);然后調(diào)用reloadSections刷新section:
- (void)tapAction:(UITapGestureRecognizer *)tap{
if ([_isExpandArray[tap.view.tag] isEqualToString:@"0"]) {
//關(guān)閉 => 展開(kāi)
[_isExpandArray removeObjectAtIndex:tap.view.tag];
[_isExpandArray insertObject:@"1" atIndex:tap.view.tag];
}else{
//展開(kāi) => 關(guān)閉
[_isExpandArray removeObjectAtIndex:tap.view.tag];
[_isExpandArray insertObject:@"0" atIndex:tap.view.tag];
}
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:tap.view.tag];
NSRange rang = NSMakeRange(indexPath.section, 1);
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:rang];
[_provinceTableView reloadSections:set withRowAnimation:UITableViewRowAnimationFade];
}
通過(guò)這幾步就能實(shí)現(xiàn)展開(kāi)收起的效果了.demo下載點(diǎn)擊這里