iOS amplía UITableViewCell onclick con AutoLayout

Estoy trabajando en aplicaciones simples y ahora estoy centrado en expandir UITableViewCell después de que el usuario pulse esa celda. Es la aplicación iOS 8, así que he configurado:

self.tableVIew.rowHeight = UITableViewAutomaticDimension self.tableVIew.estimatedRowHeight = 50 

Las restricciones de celdas se ven así:

introduzca la descripción de la imagen aquí

Si la celda de toque del usuario se llama a esta function:

 func extend() { self.contentView.removeConstraint(self.bottomConstraint) let additionalView = UIView() additionalView.setTranslatesAutoresizingMaskIntoConstraints(false) additionalView.backgroundColor = UIColor.orangeColor() self.contentView.addSubview(additionalView) self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[additionalView(50)]-5-|", options: nil, metrics: nil, views: ["additionalView" : additionalView])) self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-5-[additionalView(100)]-5@999-|", options: nil, metrics: nil, views: ["additionalView" : additionalView])) } 

self.bottomConstraint es costraint entre el background del círculo verde y el contenido de la celdaVer el background.

La pregunta es: ¿Por qué esta solución funciona solo si hay prioridad establecida en restricción:

 V:|-5-[additionalView(100)]-5@999-| 

?

Sin prioridad explícita obtuve errores:

 ( "<NSLayoutConstraint:0x7a63f7a0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7a737840(60)]>", "<NSLayoutConstraint:0x7a644f40 V:|-(5)-[UIView:0x7a63f2a0] (Names: '|':UITableViewCellContentView:0x7a737840 )>", "<NSLayoutConstraint:0x7a644fb0 V:[UIView:0x7a63f2a0(100)]>", "<NSLayoutConstraint:0x7a644f70 V:[UIView:0x7a63f2a0]-(5)-| (Names: '|':UITableViewCellContentView:0x7a737840 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7a644f70 V:[UIView:0x7a63f2a0]-(5)-| (Names: '|':UITableViewCellContentView:0x7a737840 )> 

Hice una demostración que te da el comportamiento exacto como quieras. aquí está el enlace: https://github.com/rushisangani/TableViewCellExpand

Establezca la restricción de sus vistas expandir / contraer como se describe en la demostración.

'UIView-Encapsulated-Layout-Height' es la restricción para el alto de fila creado después de que el sistema de vista de tabla haya calculado lo que debería ser. Simplemente cambiar la restricción dentro no es suficiente para forzar el recálculo.

Este no es un nuevo comportamiento inesperado; mientras que a veces los efectos se pueden lograr dejando que las celdas se cuelguen de la altura proporcionada por la vista de tabla, el delegado de fuente de datos de la vista de tabla debe proporcionar la altura de fila "oficial".

El proyecto de ejemplo de Apple, Table View Animations and Gestures, es ilustrativo. No se ha actualizado para las celdas autoadaptativas de iOS 8, pero vale la pena mirar independientemente. En el APLTableViewController.m, el tableViewController es el delegado para el gesto de lanzamiento de la celda, ya que necesita ajustar la altura. Its handlePinch: calls updateForPinchScale: atIndexPath: que hace la expansión como quieras.

El controller de vista de tabla no intenta cambiar la altura de la fila directamente. Primero, establece su propio object fuente de datos personalizado (llamado sectionInfo) para proporcionar un valor actualizado para el alto de fila [sectionInfo replaceObjectInRowHeightsAtIndex:indexPath.row withObject:@(newHeight)]; . Entonces, el controller de la vista de tabla hace lo siguiente:

 BOOL animationsEnabled = [UIView areAnimationsEnabled]; [UIView setAnimationsEnabled:NO]; [self.tableView beginUpdates]; [self.tableView endUpdates]; [UIView setAnimationsEnabled:animationsEnabled]; 

Desactivar todas las animaciones de UIView se debe a que esto es un apuro, por lo que debería cambiar instantáneamente sin sacudidas. Dado que solo desea un cambio de una sola vez, debe experimentar con diferentes configuraciones de animation para get el efecto que desea.

La key es el par de llamadas beginUpdates / endUpdates que aparentemente endUpdates el sistema para recalcular las alturas de las filas. Es posible que con las nuevas células autodimensionadas de iOS, simplemente cambie las restricciones y llamar a estos methods podría ser suficiente; también podría intentar empanetworkingar reloadRowsAtIndexPaths:withRowAnimation:UITableViewRowAnimationNone

establezca la prioridad de altura de una de sus vistas a 999 en lugar de 1000.