如何使用UITableView中的头部分来展开和折叠行

我有一个表格视图。 现在我想通过点击节头来折叠和展开行。 换句话说,当我点击标题的行显示该部分。 我怎样才能做到这一点?

我草拟了一些代码给你的想法。 这个概念是我们跟踪NSMutableSet中折叠的部分,并根据用户在该部分的触摸来添加/删除它。 折叠/展开animation实际上是添加/删除单元格的animation。

 #import "ViewController.h" @interface ViewController () < UITableViewDataSource, UITableViewDelegate> { NSMutableSet* _collapsedSections; } @property (nonatomic, weak) IBOutlet UITableView* tableView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _collapsedSections = [NSMutableSet new]; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 3; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [_collapsedSections containsObject:@(section)] ? 0 : 10; } -(NSArray*) indexPathsForSection:(int)section withNumberOfRows:(int)numberOfRows { NSMutableArray* indexPaths = [NSMutableArray new]; for (int i = 0; i < numberOfRows; i++) { NSIndexPath* indexPath = [NSIndexPath indexPathForRow:i inSection:section]; [indexPaths addObject:indexPath]; } return indexPaths; } -(void)sectionButtonTouchUpInside:(UIButton*)sender { sender.backgroundColor = [UIColor greenColor]; [self.tableView beginUpdates]; int section = sender.tag; bool shouldCollapse = ![_collapsedSections containsObject:@(section)]; if (shouldCollapse) { int numOfRows = [self.tableView numberOfRowsInSection:section]; NSArray* indexPaths = [self indexPathsForSection:section withNumberOfRows:numOfRows]; [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; [_collapsedSections addObject:@(section)]; } else { int numOfRows = 10; NSArray* indexPaths = [self indexPathsForSection:section withNumberOfRows:numOfRows]; [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; [_collapsedSections removeObject:@(section)]; } [self.tableView endUpdates]; //[_tableView reloadData]; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIButton* result = [UIButton buttonWithType:UIButtonTypeCustom]; [result addTarget:self action:@selector(sectionButtonTouchUpInside:) forControlEvents:UIControlEventTouchUpInside]; result.backgroundColor = [UIColor blueColor]; [result setTitle:[NSString stringWithFormat:@"Section %d", section] forState:UIControlStateNormal]; result.tag = section; return result; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell* result = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; result.textLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row]; return result; } @end 

因为这已经是个老问题了。我也search了一下,最后又从Github那里得到了一个样本代码。所以我想分享这个链接,如果在不久的将来,任何一个问题都会出现。 https://github.com/iSofTom/STCollapseTableView

TLIndexPathTools只用几行代码就可以做到这一点。 尝试运行“ 折叠”示例项目。 它的子类TLCollapsibleTableViewController ,它有一些不错的select。 它支持一次或多个部分扩展单个部分。 它还优化了滚动位置,当您展开一个部分以尽可能多地显示该部分的行时。 所以如果你点击靠近屏幕底部的部分,它会自动滚动。

示例项目的全视图控制器代码如下所示:

 #import "TLCollapsibleTableViewController.h" @interface CollapseTableViewController : TLCollapsibleTableViewController - (IBAction)toggleSingleSectionExpanded:(UISwitch *)sender; @end #import "CollapseTableViewController.h" #import "TLIndexPathSectionInfo.h" #import "TLCollapsibleDataModel.h" #define SECTION1_NAME @"Section 1" #define SECTION2_NAME @"Section 2" @interface CollapseTableViewController () @property (strong, nonatomic) TLIndexPathDataModel *backingDataModel; @end @implementation CollapseTableViewController - (void)viewDidLoad { [super viewDidLoad]; //define items for two sections NSArray *section1Items = @[ @"Fredricksburg", @"George Washington", @"Grand Canyon"]; NSArray *section2Items = @[ @"Jelly Bean", @"Bibliography", @"Keyboard Shortcut", @"Metadata", @"Fundamental", @"Cellar Door"]; //We're using plain string items, so we don't have a sectionNameKeyPath property //to use, so instead we explicitly create section info objects TLIndexPathSectionInfo *section1 = [[TLIndexPathSectionInfo alloc] initWithItems:section1Items andName:SECTION1_NAME]; TLIndexPathSectionInfo *section2 = [[TLIndexPathSectionInfo alloc] initWithItems:section2Items andName:SECTION2_NAME]; //create the backing model, which contains all sections and items self.backingDataModel = [[TLIndexPathDataModel alloc] initWithSectionInfos:@[section1, section2] andIdentifierKeyPath:nil andCellIdentifierKeyPath:nil]; [self collapseAll]; } - (void)tableView:(UITableView *)tableView configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { NSString *item = [self.dataModel itemAtIndexPath:indexPath]; cell.textLabel.text = item; } - (IBAction)toggleSingleSectionExpanded:(UISwitch *)sender { self.singleExpandedSection = sender.isOn; [self collapseAll]; } - (void)collapseAll { self.dataModel = [[TLCollapsibleDataModel alloc] initWithBackingDataModel:self.backingDataModel collapsedSectionNames:[NSSet setWithArray:self.backingDataModel.sectionNames]]; } @end 

configurationviewForHeaderInSection:

喜欢这个

 (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ UILabel *lblHeader = [[UILabel alloc]init]; lblHeader.text = @"Section 0"; lblHeader.backgroundColor = [UIColor blueColor]; lblHeader.font = [UIFont fontWithName:@"Avenir" size:18]; lblHeader.textAlignment=NSTextAlignmentLeft; lblHeader.userInteractionEnabled=YES; UIGestureRecognizer *gr; if(section==0){ lblHeader.text = @"Section 0"; gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; }else if(section == 1){ lblHeader.text = @"Section 1"; gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture1:)]; } [lblHeader addGestureRecognizer:gr]; return lblHeader; } 

然后写独立的行动电话

 - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer { } - (void)handleGesture1:(UIGestureRecognizer *)gestureRecognizer { }