uitableviewcontroller uitableviewcell example iphone cocoa-touch uitableview

iphone - example - Etiquetas alineadas en UITableViewCell



uitableviewcell lifecycle (4)

Yo uso UITableView con celdas creadas usando UITableViewCellStyleSubtitle . La altura de cada celda se ajusta dinámicamente usando el

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

método de delegado

El problema que puedes ver en la foto.

( nota: imagen actualizada )

http://img.skitch.com/20090715-g7srxgee2d7fhi5rab2wufrdgm.png

¿Cómo configurar la alineación de textLabel y detailTextLabel en la parte superior de la celda? (Realmente no me gusta hacerlo subclasificando UITableViewCell y anulando layoutSubviews)

Gracias


Aquí hay otra solución sin subclasificar celdas, por lo que ciertamente funciona con diferentes estilos de tablas. (No he comprobado otras soluciones). El título y las cadenas de detalles se declaran en mi encabezado UITableViewController y ya están definidas. ¡No son muy largos, ciertamente bien dentro de la altura 4000!

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGRect frame = [UIScreen mainScreen].bounds; CGFloat width = frame.size.width; int section = indexPath.section; int row = indexPath.row; NSString *title_string = [title_strings_array objectAtIndex:row]; NSString *detail_string = [detail_strings_array objectAtIndex:row]; CGSize title_size = {0, 0}; CGSize detail_size = {0, 0}; if (title_string && [title_string isEqualToString:@""] == NO ) { title_size = [title_string sizeWithFont:[UIFont systemFontOfSize:22.0] constrainedToSize:CGSizeMake(width, 4000) lineBreakMode:UILineBreakModeWordWrap]; } if (detail_string && [title_string isEqualToString:@""] == NO ) { detail_size = [detail_string sizeWithFont:[UIFont systemFontOfSize:18.0] constrainedToSize:CGSizeMake(width, 4000) lineBreakMode:UILineBreakModeWordWrap]; } CGFloat title_height = title_size.height; CGFloat detail_height = detail_size.height; CGFloat content_size = title_height + detail_height; CGFloat height; switch ( section ) { case 0: height = content_size; break; //Just in case default: height = 44.0; break; } return height; }


Bueno, este me costó una tarde, pero creo que lo descubrí. Por lo que puedo decir, esto parece ser un error en la forma en que UITableViewCell está distribuyendo la etiqueta de texto y la etiqueta de detalle. Cuando configura la altura de la fila, parece asignar la misma altura a las dos etiquetas, lo que significa que obtiene exactamente el comportamiento que está viendo arriba, a pesar de que detailTextLabel necesita más espacio. Aquí están las dos cosas que hice para solucionar el problema. Tuve que subclasificar UITableViewCell para arreglarlo, pero es una cantidad mínima de código.

Primero, asegúrate de calcular la altura de cada fila correctamente. Ponga este método en su delegado de vista de tabla. Reemplace los métodos de fuente con los suyos:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellDetailText = [[self itemForIndexPath: indexPath] detailDescription]; NSString *cellText = [[self itemForIndexPath: indexPath] description]; // The width subtracted from the tableView frame depends on: // 40.0 for detail accessory // Width of icon image // Editing width // I don''t think you can count on the cell being properly laid out here, so you''ve // got to hard code it based on the state of the table. CGSize constraintSize = CGSizeMake(tableView.frame.size.width - 40.0 - 50.0, CGFLOAT_MAX); CGSize labelSize = [cellText sizeWithFont: [self cellTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; CGSize detailSize = [cellDetailText sizeWithFont: [self cellDetailTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; CGFloat result = MAX(44.0, labelSize.height + detailSize.height + 12.0); return result; }

Luego, subclase UITableViewCell y anule layoutSubviews:

#import "UITableViewCellFixed.h" @implementation UITableViewCellFixed - (void) layoutSubviews { [super layoutSubviews]; self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x, 4.0, self.textLabel.frame.size.width, self.textLabel.frame.size.height); self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x, 8.0 + self.textLabel.frame.size.height, self.detailTextLabel.frame.size.width, self.detailTextLabel.frame.size.height); } @end


Si resulta que la textLabel y la detailTextLabel están distribuidas con máscaras de tamaño automático, quizás pueda hacer esto cuando devuelva la celda:

cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; cell.detailTextLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Si esto funciona, es un poco más fácil que subclasificar la celda. Aunque no lo he probado.


Sin embargo, está dimensionando sus celdas, debe hacerlo con los diversos métodos de dimensionamiento de NSString. De esa manera, puedes determinar exactamente cuán alto es el tamaño de la celda y evitar el espacio en blanco.