带固定节头的UITableView

问候,我读到, UITableView的默认行为是将节标题行固定到表的顶部,当您滚动部分,直到下一部分将previos部分行推出视图。

我有一个UITableView里面的UIViewController ,这似乎并不是这种情况。

这仅仅是UITableViewController的默认行为吗?

这里有一些基于我所拥有的简化代码。 我将展示UIController接口和我已经实现的每个表视图方法来创build表视图。 我有一个帮助数据源类,帮助我索引我的对象与表一起使用。

  @interface MyUIViewController ()<UITableViewDelegate, UITableViewDataSource> @property (nonatomic, readonly) UITableView *myTableView; @property (nonatomic, readonly) MyCustomHelperDataSource *helperDataSource; @end //when section data is set, get details for each section and reload table on success - (void)setSectionData:(NSArray *)sections { super.sectionData = sections; //this array drives the sections //get additional data for section details [[RestKitService sharedClient] getSectionDetailsForSection:someId success:^(RKObjectRequestOperation *operation, RKMappingResult *details) { NSLog(@"Got section details data"); _helperDataSource = [[MyCustomHelperDataSource alloc] initWithSections:sections andDetails:details.array]; [myTableView reloadData]; } failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"Failed getting section details"); }]; } #pragma mark <UITableViewDataSource, UITableViewDelegate> - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (!_helperDataSource) return 0; return [_helperDataSource countSectionsWithDetails]; //number of section that have details rows, ignore any empty sections } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //get the section object for the current section int SectionObject *section = [_helperDataSource sectionObjectForSection:section]; //return the number of details rows for the section object at this section return [_helperDataSource countOfSectionDetails:section.sectionId]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell * cell; NSString *CellIdentifier = @"SectionDetailCell"; cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; cell.textLabel.font = [UIFont systemFontOfSize:12.0f]; } //get the detail object for this section SectionObject *section = [_helperDataSource sectionObjectForSection:indexPath.section]; NSArray* detailsForSection = [_helperDataSource detailsForSection:section.sectionId] ; SectionDetail *sd = (SectionDetail*)[detailsForSection objectAtIndex:indexPath.row]; cell.textLabel.text = sd.displayText; cell.detailTextLabel.text = sd.subText; cell.detailTextLabel.textColor = [UIColor blueTextColor]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 50.0f; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 30.0f; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section { //get the section object for the current section SectionObject *section = [_helperDataSource sectionObjectForSection:section]; NSString *title = @"%@ (%d)"; return [NSString stringWithFormat:title, section.name, [_helperDataSource countOfSectionDetails:section.sectionId]]; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 260, 0)]; header.autoresizingMask = UIViewAutoresizingFlexibleWidth; header.backgroundColor = [UIColor darkBackgroundColor]; SSLabel *label = [[SSLabel alloc] initWithFrame:CGRectMake(3, 3, 260, 24)]; label.font = [UIFont boldSystemFontOfSize:10.0f]; label.verticalTextAlignment = SSLabelVerticalTextAlignmentMiddle; label.backgroundColor = [UIColor clearColor]; label.text = [self tableView:tableView titleForHeaderInSection:section]; label.textColor = [UIColor whiteColor]; label.shadowColor = [UIColor darkGrayColor]; label.shadowOffset = CGSizeMake(1.0, 1.0); [header addSubview:label]; return header; } 

当表的UITableViewStyle属性设置为UITableViewStylePlain时,只有标题保持不变。 如果您将它设置为UITableViewStyleGrouped ,则标题将向上滚动单元格。

你也可以将tableview的bounces属性设置为NO。 这将保持节标题非浮动/静态,但是你也失去了tableview的反弹属性。

Swift 3.0

UITableViewDelegateUITableViewDataSource协议创build一个ViewController 。 然后在里面创build一个tableView,将其样式声明为UITableViewStyle.grouped 。 这将修复标题。

 lazy var tableView: UITableView = { let view = UITableView(frame: UIScreen.main.bounds, style: UITableViewStyle.grouped) view.delegate = self view.dataSource = self view.separatorStyle = .none return view }() 

改变你的TableView风格:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

根据UITableView的苹果文档:

UITableViewStylePlain-一个普通的表格视图。 任何节标题或页脚显示为行内分隔符,并在滚动表视图时浮动。

UITableViewStyleGrouped – 一个表视图,其各节显示不同的行组。 部分页眉和页脚不会浮动。

希望这个小小的改变会帮助你..

现在你的tableview看起来像普通的表格样式,但不会浮动设置为组的表格样式。

 [_tableView setBackgroundView:nil]; _tableView.backgroundColor = [UIColor whiteColor];