Ok, sé que es tarde pero tuve que hacerlo. Llevo 10 horas buscando una solución que funcione pero no encontré una respuesta completa. Encontré algunas pistas pero difícil de entender para los principiantes. Así que tuve que poner mis 2 centavos y completar la respuesta.
Como se ha sugerido en algunas de las respuestas, la única solución de trabajo que pude implementar es insertar celdas normales en la vista de tabla y manejarlas como encabezados de sección, pero la mejor manera de lograrlo es insertando estas celdas en fila 0 de cada sección. De esta manera podemos manejar estos encabezados personalizados no flotantes muy fácilmente.
Entonces, los pasos son.
Implemente UITableView con estilo UITableViewStylePlain.
-(void) loadView
{
[super loadView];
UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
tblView.delegate=self;
tblView.dataSource=self;
tblView.tag=2;
tblView.backgroundColor=[UIColor clearColor];
tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
Implemente titleForHeaderInSection como de costumbre (puede obtener este valor usando su propia lógica, pero prefiero usar delegados estándar).
- (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *headerTitle = [sectionArray objectAtIndex:section];
return headerTitle;
}
Número de ejemplo de Secciones en Tabla Ver como de costumbre
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
int sectionCount = [sectionArray count];
return sectionCount;
}
Implemente numberOfRowsInSection como de costumbre.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int rowCount = [[cellArray objectAtIndex:section] count];
return rowCount +1; //+1 for the extra row which we will fake for the Section Header
}
Devuelve 0.0f en heightForHeaderInSection.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.0f;
}
NO implemente viewForHeaderInSection. Elimine el método por completo en lugar de devolver nulo.
En heightForRowAtIndexPath. Compruebe si (indexpath.row == 0) y devuelva la altura de celda deseada para el encabezado de sección, de lo contrario, devuelva la altura de la celda.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row == 0)
{
return 80; //Height for the section header
}
else
{
return 70; //Height for the normal cell
}
}
Ahora en cellForRowAtIndexPath, verifique si (indexpath.row == 0) e implemente la celda como desea que sea el encabezado de la sección y establezca el estilo de selección en none. ELSE implementa la celda como desea que sea la celda normal.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
}
cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
return cell;
}
else
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
}
cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
return cell;
}
}
Ahora implemente willSelectRowAtIndexPath y devuelva nil si indexpath.row == 0. Esto cuidará de que didSelectRowAtIndexPath nunca se active para la fila del encabezado de la Sección.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
return nil;
}
return indexPath;
}
Y finalmente en didSelectRowAtIndexPath, verifique si (indexpath.row! = 0) y continúe.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != 0)
{
int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
//Do what ever you want the selection to perform
}
}
Con esto has terminado. Ahora tiene un encabezado de sección perfectamente flotante y no flotante.