Deslizar para eliminar la celda hace que tableViewHeader se mueva con la celda

He encontrado un error extraño con mi tableViewHeader en mi UITableView en iOS 8. Al pasar por una celda para revelar el button de eliminar (iOS estándar, pasar-borrar), mueve el tableViewHeader junto con la celda que se está deslizando. Al deslizar la celda, el encabezado se mueve de la misma manera que lo hace la celda que se está deslizando. No se mueven otras celdas en la vista de tabla, solo el encabezado y la celda que se esté deslizando. He probado esto en iOS 7 no se han encontrado con el problema. Para mí, esto parece un error con tableViewHeader en iOS 8, ya que solo ocurre en esta versión y parece algo que nunca debería ocurrir. No veo ninguna razón para que el encabezado se incluya en swipe-to-delete.

A continuación es solo una maqueta. Swipe-to-delete dentro de la aplicación es iOS pnetworkingeterminado, nada personalizado.

A continuación es solo una maqueta. Swipe-to-delete dentro de la aplicación es iOS predeterminado, nada personalizado.

Sobre la base de la respuesta de ferris, encontré la manera más fácil cuando se usa un UITableViewCell como encabezado de sección es devolver el contenido de la vista de la celda en viewForHeaderInSection. El código es el siguiente:

 override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader return cell.contentView //cellSectionHeader is my subclassed UITableViewCell } 

Esto se debió a que estaba utilizando un UITableViewCell como el encabezado de la tabla. Para resolver el problema de tableView.tableHeaderView = cell , en lugar de usar tableView.tableHeaderView = cell , uso lo siguiente:

 UIView *cellView = [[UIView alloc] init]; [cellView addSubview:cell]; tableView.tableHeaderView = cellView 

No sé por qué esto soluciona el problema, especialmente si funciona en iOS 7, pero parece que soluciona el problema.

Asegúrate de agregar toda la vista a la vista de celdas, como se supone a las celdas contentView, de lo contrario, los botones no responderán.

Trabajos:

[cell addSubview:view]; o [self addSubview:view];

No funciona

[cell.contentView addSubview:view] o [self.contentView addSubview:view]

La forma de evitar que los encabezados se muevan con las celdas es devolver el contenido de la celda en viewForHeaderInSection. Si tiene una subclass UITableViewCell denominada SectionHeaderTableViewCell, este es el código correcto:

 -(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"]; //Do stuff to configure your cell return cell.contentView; } 

SWIFT 3.0 Solución probada. Como se menciona en el primer ejemplo para Objective-C; el punto key es devolver cell.contentView en lugar de cell. La syntax del formatting nuevo es la siguiente.

 override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { // HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") cell.songLabel.text = "Your Section Name" return cell.contentView } 

Intente implementar este método y proporcione las condiciones adecuadas para comprobar el desplazamiento. Si se solicita este método para la vista del encabezado.

1.tableView: editingStyleForRowAtIndexPath: 2.tableView: titleForDeleteConfirmationButtonForRowAtIndexPath: 3.tableView: shouldIndentWhileEditingRowAtIndexPath:

Un problema que no se menciona con el método .contentView es que si su celda de vista de tabla usa layoutSubviews, es posible que no obtenga el comportamiento que desea, ya que no se llamará a layoutSubviews. Terminé de hacer una subclass UIView totalmente independiente que respalda tanto la operación de la célula normal como la operación del encabezado, y la creación de una class de celda mínima UITableView que lo use.

La cuestión de Victor de perder el color de background, se resuelve por debajo de la adición a la respuesta de Brad:

 cell.backgroundColor = UIColor.cyanColor() 

A:

 cell.contentView.backgroundColor = UIColor.cyanColor() 

Si después de agregar cell.contentView, la sección se vuelve en blanco, debes ir al inspector de properties y asegurarte de que la class de tamaño universal está marcada (donde dice "instalado"). Lo más probable es que esté usando wRhR o algo por el estilo. Debe revisar cada elemento y restricción de la tabla y marcar la checkbox instalada.