ios uitableview ios8

UITableView saltando al principio en las actualizaciones finales mientras se escribe dentro de una celda en iOS 8 auto height



ios8 (5)

Estoy usando celdas de auto-dimensionamiento de iOS 8 ( tableView.rowHeight = UITableViewAutomaticDimension y tableView:estimatedHeightForRowAtIndexPath: . Funciona muy bien hasta que empiezo a escribir algo dentro de una celda. Cuando estoy escribiendo, estoy llamando al par beginUpdates / endUpdates para cambiar el tamaño de mi celda (la vista de texto aumenta a medida que endUpdates y se reduce a medida que borro), pero cada llamada resulta en un mal salto al principio de la vista de tabla. Si endUpdates par beginUpdates / endUpdates entonces no salta, pero mi celda no beginUpdates endUpdates beginUpdates endUpdates .

Aquí hay una demostración del problema:

¿Cómo puedo hacer que mi celda se redimensione correctamente mientras escribo sin saltar a la parte superior de la vista de tabla? Solo me dirijo a iOS> = 8, por lo que no necesito ningún tipo de compatibilidad con iOS 7.


¿Se está editando el marco de restablecimiento de la celda de vista de tabla en el texto? En caso afirmativo, puede verificar sus variables a veces debido a la desasignación de las variables de asignación de memoria. Use puntos de ruptura y verifique los valores de las variables que no se pueden cambiar según su requisito.


El diseño automático tiene algunos inconvenientes asociados con él. Cuando empieces a escribirlo, salta porque todas las demás celdas están ajustando su tamaño, por lo que será mejor si calculas las dimensiones de la celda solo en tiempo de ejecución.


Encontré la solución de Manoj Aher para trabajar bien, el texto no salta en absoluto. Pero en mi caso tuve que extenderme para situaciones en las que el usuario pudiera escribir mucho más texto (de modo que la celda de la tabla sea más grande que la parte visible de la tabla) y luego vuelva a editar este texto en algún lugar al principio o en el medio. Así que tuve que desplazar la celda de la tabla a Top o Middle según el lugar donde el usuario está escribiendo para mantener la posición de escritura visible.

Primero, recuerde el indexPath para la celda de cualquier manera conveniente. Por ejemplo:

var cellIndexChosenForEdition: NSIndexPath ... func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { cellIndexChosenForEdition = indexPath ... }

En shouldChangeTextInRange o cualquier otro método que se llame cuando se especifique qué tipo de usuario (se muestra aquí se llamará al método cuando su controlador de vista se ajuste al protocolo UITextViewDelegate):

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { ... UIView.setAnimationsEnabled(false) MyTableView.beginUpdates() MyTableView.endUpdates() UIView.setAnimationsEnabled(true) if let textStartPosition: UITextPosition = textView.selectedTextRange?.start { let cursorPosition = textView.offsetFromPosition(textView.beginningOfDocument, toPosition: textStartPosition) if textView.text.characters.count - cursorPosition < 170 { table_create_issue.scrollToRowAtIndexPath(cellIndexChosenForEdition, atScrollPosition: .Bottom, animated: false) } else if cursorPosition > 200 { table_create_issue.scrollToRowAtIndexPath(cellIndexChosenForEdition, atScrollPosition: .Middle, animated: false) } else { table_create_issue.scrollToRowAtIndexPath(cellIndexChosenForEdition, atScrollPosition: .Top, animated: false) } } ... }

* las constantes 200 y 170 deben cambiarse para adaptarse a su situación concreta

** No usé scrollRangeToVisible porque la altura de textView es siempre igual a la altura de la celda y nunca se desplaza.


Estaba implementando exactamente lo mismo para la aplicación de chat y obteniendo el mismo problema que tiene ahora. Esta cosa me ayudó. Déjame saber si esto funciona para ti también.

UIView.setAnimationsEnabled(false) tableView.beginUpdates() cell.textView.scrollRangeToVisible(NSMakeRange(cell.textView.text.characters.count-1, 0)) tableView.endUpdates() UIView.setAnimationsEnabled(true) tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: false)


Estoy teniendo el mismo problema y he podido minimizar (pero no eliminar) los saltos haciendo solo la notificación de cambio de tamaño / actualización cuando el tamaño intrínseco del contenido realmente ha cambiado, por ejemplo:

Rápido

var textViewHeight: CGFloat = 0.0 // Set in viewWillAppear as below ... func textViewDidChange(textView: UITextView) { let newHeight = textView.intrinsicContentSize().height if textViewHeight != newHeight{ textViewHeight = newHeight tableView.beginUpdates() tableView.endUpdates() } }

C objetivo

CGFloat textViewHeight = 0.0; // Set in viewWillAppear as below ... (void)textViewDidChange:(UITextView *)textView { CGFloat newHeight = [textView intrinsicContentSize].height; if (textViewHeight != newHeight){ textViewHeight = newHeight [tableView beginUpdates]; [tableView endUpdates]; } }