UItableview點選後的摺疊效果的簡單實現
阿新 • • 發佈:2019-02-07
專案有個需求。要求將主要資訊列表展示,點選資訊的時候,下方彈出來一個具體內容展示變化,差異等等。
之前做過這個,當時是網上找的一篇文章直接複製貼上的,過了一段時間就給忘了,連思路都沒有,今天花了一天時間,自己整理了一下,實現了這個效果,並做了一個優化,下面開始上程式碼
首先說下思路,tableview進入的時候展示的是各個cell的section的headerview,cell預設給一個0的高度,這時我們看到的就是各個section展示的主要部分內容,接著定義一個數組,這個陣列內部儲存每個section點選的結果,1是展開cell,0是收縮cell。當tableview拿到資料來源dataArray的時候,就在下方寫一個for迴圈根據dataArray的count依次遍歷,迴圈執行N次,陣列就新增N個0,得到一個dataArray的count個數的記錄開啟關閉的陣列,留待後用。然後給section新增一個點選事件就可以了
@interface XDYCROutController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic , strong) UITableView *table;
@property (nonatomic,strong)NSMutableArray *flagArray;//記錄狀態的陣列
@end
- (void)viewDidLoad {
[super viewDidLoad];
_flagArray = [NSMutableArray array];
[self loadData];
self.view.backgroundColor = ColorRGB(240, 240, 240);
self.table = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, self.view.mj_w, self.view.mj_h) style:UITableViewStyleGrouped];
self.table.delegate = self;
self.table.dataSource = self;
self.table.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
[self .view addSubview:self.table];
}
接著就是網路請求回來的資料,給dataArray,然後我們給_flagArray賦值
for (NSInteger i = 0; i<self.dataArray.count; i++) {
[_flagArray addObject:@"0"];
}
// 注意,我因為點選section後彈出的始終是一個cell,所以我的flagarray內部只需要加入count個記錄就可以,如果你是點選section彈出多個cell,就要像下面這樣
// for (int i = 0; i < num; i ++) {
// NSMutableArray *rowArray = [NSMutableArray array];
// for (int j = 0; j < X(每個section對應的存有cell個數的陣列個數); j ++) {
// [rowArray addObject:[NSString stringWithFormat:@"%d",j]];
// }
// [_sectionArray addObject:rowArray];
// [_flagArray addObject:@"0"];
//}
這樣我們需要的兩組資料都有了,一個是保有內容的dataArray,一個是負責記錄狀態的flagarray
tableview的代理裡面:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return self.dataArray.count;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 1;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if ([_flagArray[indexPath.section] isEqualToString:@"0"])
return 0;
else
return 100;
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 70;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIView *headView = [UIView new];
headView.tag = 100 + section;
headView.backgroundColor = ColorRGB(240, 240, 240);
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(headerClick:)];
[headView addGestureRecognizer:recognizer];
UILabel *partNameLabel = [[UILabel alloc] init];
partNameLabel.frame = CGRectMake(20, 0, 120, 15);
partNameLabel.textColor = ColorRGB(140, 140, 140);
partNameLabel.font = font(13);
partNameLabel.text = @"配件名稱";
[headView addSubview:partNameLabel];
xxxxx一堆view的程式碼
return headView;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView registerClass:[XDYChangeRecordOutTableViewCell class] forCellReuseIdentifier:@"cell"];
XDYChangeRecordOutTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.model=self.dataArray[indexPath.section];
// 實現的時候,如果不加上下面這句話,cell不會預設收縮,所以我加了下面的程式碼,cell的bottomview內是各個子控制元件
cell.bottomView.hidden = [_flagArray[indexPath.section] isEqualToString:@"0"];
return cell;
}
-(void)headerClick:(UITapGestureRecognizer*)tap{
long int index = tap.view.tag - 100;
NSMutableArray *indexArray = [[NSMutableArray alloc]init];
// NSArray *arr = self.dataArray[index];
// for (int i = 0; i < arr.count; i ++) {
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:index];
[indexArray addObject:path];
// }
//展開
// 注意,我這裡上面註釋掉的部分,如果你的section點選後,彈出的是多個cell,就要把上面的註釋開啟,
// 點選時,從狀態陣列內取出儲存的狀態值,利用下面的reload方法進行資料的重寫,展開或者收縮cell就行了,
if ([_flagArray[index] isEqualToString:@"0"]) {
_flagArray[index] = @"1";
[self.table reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationBottom];
// 因為我的section內有一個圖片是箭頭,代表展開或者收縮的提示,所以我需要對section也進行reload
[self.table reloadSections:[NSIndexSet indexSetWithIndex:index] withRowAnimation:UITableViewRowAnimationNone];
} else { //收起
_flagArray[index] = @"0";
[self.table reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationTop];
[self.table reloadSections:[NSIndexSet indexSetWithIndex:index] withRowAnimation:UITableViewRowAnimationNone];
}
}
好了,主要程式碼都寫在這裡了,其實很簡單,當時做的時候圖省事複製貼上,現在自己做了一遍,覺得還是自己動手來的實在,效果最顯著了。
附圖: