iphone ios uitableview heightforrowatindexpath

iphone - ¿Cómo obtener el UITableViewCell dentro de heightForRowAtIndexPath?



ios (6)

¿Cómo se obtiene uno el UITableViewCell cuando está dentro del método heightForRowAtIndexPath , es decir, dado el indexPath?

(Luego podría acceder a las vistas de contenido que he creado para agregar sus alturas)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // How to get the UITableViewCell associated with this indexPath? }

Gracias

EDITAR: De hecho, ¿hay realmente una forma válida de hacer esto? Cuando coloco algunas declaraciones NSLog , parece que heightForRowAtIndexPath llamó varias veces antes de las llamadas a cellForRowAtIndexPath (que es donde configuro los UILabels en la celda)? Este tipo implica que se puede intentar usar una técnica que no funcionará, es decir, esperaba en heightForRowAtIndexPath para acceder a las etiquetas ya creadas en cada celda para obtener su altura y agregarlas para la altura total de la fila de celdas, SIN EMBARGO aún no se ha configurado (dentro de cellForRowAtIndexPath ) entonces supongo que mi enfoque realmente no funciona.


Esta pregunta no tiene sentido porque en

heightForRowAtIndexPath

Todavía no se han creado células. Así es como funciona tableView:

  1. TableView le pregunta a su fuente de datos cuántas secciones tendrá. -numberOfSectionsInTableView
  2. Pregunta a la fuente de datos cuántas filas tendrá cada sección (para saber qué tamaño debe tener la -numberOfRowsInSection desplazamiento, etc.) -numberOfRowsInSection
  3. Pregunta la altura del delegado de cada fila visible . Para saber dónde se ubicarán las celdas. - heightForRowAtIndexPath
  4. Por último, le pide a la fuente de datos que le dé una celda para mostrar en la ruta de índice dada -cellForRowAtIndexPath

Por lo tanto, no puede acceder a las celdas desde heightForRowAtIndexPath porque con una celda más probable aún no se ha creado.

Sin embargo, en caso de que haya entendido mal su pregunta, intente:

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];


La respuesta obvia es llamar a cellForRowAtIndexPath , pero es posible que ya hayas descubierto que hay algunos problemas con eso. Vea esta pregunta si aún no lo ha hecho: UITableView flexible / dynamic heightForRowAtIndexPath

Para mi último proyecto utilicé una subclase personalizada de UICell e implementé un método como este. Luego lo llamé desde la table:heightForRowAtIndexPath: (después de buscar el contenido de esa fila).

+ (CGFloat) heightOfContent: (NSString *)content { CGFloat contentHeight = [content sizeWithFont: DefaultContentLabelFont constrainedToSize: CGSizeMake( DefaultCellSize.width, DefaultContentLabelHeight * DefaultContentLabelNumberOfLines ) lineBreakMode: UILineBreakModeWordWrap].height; return contentHeight + DefaultCellPaddingHeight; }


Le sugiero que calcule la altura correcta de una fila en la table:heightForRowAtIndexPath: utilizando su estructura de datos (Altura del texto, imágenes, texto de varias líneas, etc.).

Y cambie la altura del componente en su método -(void) layoutSubviews .


Para iOS8 :

override func viewDidLoad() { super.viewDidLoad() self.tableView.estimatedRowHeight = 80 self.tableView.rowHeight = UITableViewAutomaticDimension }

O

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }

Pero para iOS7 , la clave es calcular la altura después del autolayout,

func calculateHeightForConfiguredSizingCell(cell: GSTableViewCell) -> CGFloat { cell.setNeedsLayout() cell.layoutIfNeeded() let height = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize).height + 1.0 return height }

Nota:

1) Si las etiquetas de varias líneas, no olvide, establezca numberOfLines en 0.

2) No olvide label.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds)


Puede utilizar el delegado de la vista de tabla en lugar de la vista de tabla en sí.

id cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

Comprueba la respuesta here

ACTUALIZADO

En las nuevas versiones de iOS y utilizando las restricciones automáticas correctas, ya no es necesario que haga referencia a la celda para calcular la altura de la celda.

Chequea aquí

https://www.raywenderlich.com/129059/self-sizing-table-view-cells


Si quieres acceder a las celdas utiliza etiquetas. Pero como @Jhaliya ha dicho que es mejor calcular la altura en función del contenido de la celda. Si tiene en cuenta la posición de la celda, le sugiero que utilice la vista de desplazamiento e implemente las celdas donde lo desee.