1. 程式人生 > >UItableview點選後的摺疊效果的簡單實現

UItableview點選後的摺疊效果的簡單實現

專案有個需求。要求將主要資訊列表展示,點選資訊的時候,下方彈出來一個具體內容展示變化,差異等等。
之前做過這個,當時是網上找的一篇文章直接複製貼上的,過了一段時間就給忘了,連思路都沒有,今天花了一天時間,自己整理了一下,實現了這個效果,並做了一個優化,下面開始上程式碼

首先說下思路,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];
    }

}

好了,主要程式碼都寫在這裡了,其實很簡單,當時做的時候圖省事複製貼上,現在自己做了一遍,覺得還是自己動手來的實在,效果最顯著了。
附圖:
這裡寫圖片描述

點選後

點選後