UITableView con encabezados de sección fija

Saludos, estoy leyendo que el comportamiento predeterminado de UITableView es anclar las filas del encabezado de la sección en la parte superior de la tabla a medida que se desplaza por las secciones hasta que la siguiente sección empuja la fila de la sección anterior a la vista.

Tengo una UITableView dentro de un UIViewController y este no parece ser el caso.

¿Es solo el comportamiento UITableViewController para UITableViewController ?

Aquí hay un código simplificado basado en lo que tengo. UIController interfaz de UIController y cada método de vista de tabla que he implementado para crear la vista de tabla. Tengo una clase de fuente de datos de ayuda que me ayuda a indexar mis objetos para usarlos con la tabla.

  @interface MyUIViewController () @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  - (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; } 

Los encabezados solo permanecen fijos cuando la propiedad UITableViewStyle de la tabla se establece en UITableViewStylePlain . Si lo tiene configurado en UITableViewStyleGrouped , los encabezados se desplazarán hacia arriba con las celdas.

También puede establecer la propiedad de rebotes de la tabla de vista en NO. Esto mantendrá los encabezados de sección no flotantes / estáticos, pero también perderá la propiedad de rebote de la tabla vista.

Swift 3.0

Cree un ViewController con los protocolos UITableViewDelegate y UITableViewDataSource . A continuación, cree un tableView dentro de él, declarando que su estilo es UITableViewStyle.grouped . Esto arreglará los encabezados.

 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 }() 

Cambie su estilo TableView:

self.tableview = [[UITableView alloc] initwithFrame: estilo de marco: UITableViewStyleGrouped];

Según la documentación de apple para UITableView:

UITableViewStylePlain- Una vista de tabla simple. Los encabezados o pies de página de cada sección se muestran como separadores en línea y flotan cuando se desplaza la vista de tabla.

UITableViewStyleGrouped: una vista de tabla cuyas secciones presentan distintos grupos de filas. Los encabezados y pies de página de la sección no flotan.

Espero que este pequeño cambio te ayude …

Ahora su tabla vista se ve como un estilo de tabla simple pero no flota buz configurando el estilo de tabla establecido en grupo.

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

para hacer que el encabezado de secciones de UITableView no sea pegajoso o pegajoso:

  1. cambie el estilo de la vista de tabla: agrúpela para que no quede pegajosa y deje en claro los encabezados de las secciones adhesivas; no lo olvide: puede hacerlo desde el guión gráfico sin escribir código. (haga clic en su vista de tabla y cámbiela por el estilo del menú lateral / componente derecho)

  2. si tiene componentes adicionales, como vistas personalizadas, etc., compruebe los márgenes de la vista de tabla para crear el diseño adecuado. (como la altura del encabezado para las secciones y la altura de la celda en la ruta del índice, secciones)