2011-02-03 15 views
28

Necesito hacer un UITableViewCell que retiene una gran cantidad de texto. Sé que puedo agregar un UITextView a mi celular, pero cada entrada no tendrá la misma cantidad de texto.UITableViewCell, UITextView con altura dinámica

Sé que puedo controlar la altura del UITableViewCell con: -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath, pero eso no es realmente lo que estoy buscando.

Escenario 1:

--------------- 
| First Cell | 
--------------- 
--------------- 
| Second Cell | 
| with some  | 
| text.   | 
--------------- 
--------------- 
| Third Cell | 
--------------- 

Escenario 2:

--------------- 
| First Cell | 
--------------- 
--------------- 
| Second Cell | 
| with some  | 
| more text and | 
| an unknown | 
| cell height. | 
--------------- 
--------------- 
| Third Cell | 
--------------- 
+0

no está claro lo que está buscando, - (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath es la forma estándar de hacerlo. –

+4

Sí, pero cuando no se conoce la altura de la celda por adelantado, no tiene sentido. – WrightsCS

Respuesta

34

Uso UILabel para el texto celular. Luego puede usar sizeWithFont:constrainedToSize: para calcular la altura de ese UILabel dentro de cada celda. Por ejemplo:

#define PADDING 10.0f 

- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *text = [self.items objectAtIndex:indexPath.row]; 
    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)]; 

    return textSize.height + PADDING * 3; 
} 
+2

En cuanto al UILabel en sí, use 'sizeWithFont: constrainedToSize:' para precalcular el tamaño requerido y renderizarlo con 'drawInRect: withFont:' –

+0

¿Qué tipo de ajuste hace sizeWithFont: constrainedToSize: assume? – Bogatyr

+0

+1 gracias por esto, tengo una etiqueta dinámica en una celda de tabla y ¡esto funcionó perfectamente! También tuve que establecer el marco de la etiqueta en cellForRowAtIndexPath en el cálculo textSize. – Bogatyr

2

Es algo bastante complicado, ya que implica cosas como la contentInset de que la vista de texto que tendrá que tener en cuenta al calcular el tamaño de los textos. He escrito mis aprendizajes y la solución para calcular el UITableViewCell height based on an inner UITextView en mi blog. La publicación contiene el código que funciona para aplicaciones universales, tanto estilos de vista de tabla como autorrotación.

2

La solución es bastante simple y se debe trabajar desde iOS 7. Asegúrese de que la opción está activada Scrolling Enabledfuera para la UITextView dentro del UITableViewCell en la Historieta.

Luego, en viewDidLoad de su UITableViewController() define el tableView.rowHeight = UITableViewAutomaticDimension y tableView.estimatedRowHeight > 0 tales como:

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 44.0 
} 

Eso es todo. La altura de UITableViewCell se ajustará automáticamente en función de la altura interior de UITextView.

Cuestiones relacionadas