¿Cómo es posible que la altura de UITableViewCellContentView sea diferente de heightForRowAtIndexPath:

Me enfrento a un problema realmente extraño en mi UITableView. Tengo algunas celdas diferentes que quiero mostrar en una vista de tabla similar a la de un server de noticias.

Y tengo un problema con una celda después de la reutilización. La celda contiene dos imágenes, dos tags y una vista con los botones compartir / gustar / comentar. Trataré de dibujarlo, pero no estoy seguro de que vaya a ser bonito:

------------------------------------------------- | | __ ____________________________ | | | |_2| | | | | | | 3 | | | | | | | | 1 | |____________________________| | | | | | |_______________________________________| | | | | | 4 | |_______|_______________________________________| | | | 5 | |_______________________________________________| 1 : objectImage 2 : subjectImage 3 : titleLabel 4 : commentLabel 5 : actionsView 

Y mis limitaciones son:

 "H:|-0-[objectImage(60)]-7-[subjectImage(30)]-7-[titleLabel]-7-|" "H:|-0-[objectImage(60)]-0-[commentLabel]-0-|" "H:|-0-[actionsView]-0-|" "V:|-0-[objectImage(>=35)]-0-[actionsView(44)]-0-|" "V:|-7-[subjectImage(30)]" "V:|-7-[titleLabel(>=46)]-7-[commentLabel(>=35)]-0-[actionsView(44)]-0-|" 

Y cada vez que se dibuja la celda, cambio esta restricción:

 "V:[commentLabel(%0.2f)]" 

Las celdas se muestran perfectamente la primera vez.

Pero, el problema que tengo es que en un punto, después de un poco de reutilización (no puedo reproducirlo todo el time), la aplicación se bloquea debido a un problema de restricción. Aquí está la exception:

 "<NSLayoutConstraint:0x205a75b0 V:[UILabel:0x1ef31430(105)]>", "<NSLayoutConstraint:0x1ef34440 V:[UILabel:0x1ef31430]-(0)-[UIView:0x1ef2fe50]>", "<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]>", "<NSLayoutConstraint:0x1ef33900 V:|-(7)-[UILabel:0x1ef31250] (Names: '|':UITableViewCellContentView:0x1ef2bf50 )>", "<NSLayoutConstraint:0x1ef34340 V:[UILabel:0x1ef31250(>=46)]>", "<NSLayoutConstraint:0x1ef33210 V:[UIView:0x1ef2fe50]-(0)-| (Names: '|':UITableViewCellContentView:0x1ef2bf50 )>", "<NSLayoutConstraint:0x1ef331d0 V:[UIView:0x1ef2fe50(44)]>", "<NSAutoresizingMaskLayoutConstraint:0x1ef36f90 h=--& v=--& V:[UITableViewCellContentView:0x1ef2bf50(147)]>" Will attempt to recover by breaking constraint <NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]> 

El problema es que la restricción [UITableViewCellContentView: 0x1ef2bf50 (147)] no es correcta.

Lo que es extraño es que el heightForRowAtIndexPath: devuelve el valor correcto que es 217.

¡Y lo que no entiendo es que la altura de UITableViewCell es correcta!

 (lldb) po 0x1ef2bf50 $0 = 519225168 <UITableViewCellContentView: 0x1ef2bf50; frame = (0 0; 320 147); gestureRecognizers = <NSArray: 0x1ef30a20>; layer = <CALayer: 0x1ef2a3d0>> (lldb) po [0x1ef2bf50 superview] $1 = 0x1ef30e40 <NewsSubjectCommentCell: 0x1ef30e40; baseClass = UITableViewCell; frame = (0 1055; 320 217); hidden = YES; autoresize = W; layer = <CALayer: 0x1ef25e10>> 

Entonces no entiendo cómo es posible que la restricción de altura de UITableViewCellContentView sea 147. Es el alto de otra celda del mismo tipo, pero debería cambiarse a 209, ¿verdad?

Entonces, si tienes alguna idea de cómo puede suceder esto (tal vez hice algo mal), me alegraría.

Gracias,

Encontré la respuesta aquí: Problema de restricciones de layout automático en iOS7 en UITableViewCell

Solo tenemos que configurar el AutoresizingMask de the contentView en UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth y … ¡problema resuelto!

Puede tratar de establecer las alturas (/ algunas) en una prioridad más baja (p. Ej., @ 900). Tuve un problema similar (mi UITableViewCellContentView era demasiado pequeño y las restricciones no podían satisfacerse). Después de que bajé la prioridad de mi altura "incorrecta", estaba colocando bien en las alturas previstas.

Tienes que desactivar la conversión de autorescriptor para la vista que contiene tus restricciones si agregas tus restricciones con código o lenguaje visual:

  [self.someView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

Esto evita que se [UITableViewCellContentView:0x1ef2bf50(147)] la [UITableViewCellContentView:0x1ef2bf50(147)] .

En cellForRowAtIndexPath, solicita una celda desde tableview. La celda que obtendrá será una celda recién creada (con el tamaño 320,44) o una celda que se ha eliminado y envió el post prepareForReuse (con el tamaño que tenía anteriormente ). Cuando aplica el código NSLayoutConstraints a la ContentView, se resuelven antes de que la celda se ajuste al espacio proporcionado por la tabla. Esto no tiene sentido, pero definitivamente es la conclusión de mis observaciones.

Por lo tanto, en mi caso estaba recibiendo nuevas celdas con 44 alturas, pero una de mis limitaciones era una altura fija de 48. Esto arrojaba excepciones constantemente y hacía que la debugging fuera un dolor. Todo lo que hice para hacer que las excepciones desaparecieran era configurar el marco de la celda a la altura correcta (y el ancho supongo que si experimentas problemas en la dimensión horizontal) cuando lo estaba preparando en cellForRowAtIndexPath.

 UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell==nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; // If the cell is new its frame will be (0,0,320,44) cell.frame = CGRectMake(0,0,tableview.frame.size.width,calculatedHeightRequinetworkingForLayout); [cell.contentView addConstraints:constraints]; 

La celda automáticamente cambiará de tamaño a las dimensiones correctas antes de que se muestre en la vista de tabla, de modo que no causará ningún problema, pero las restricciones de layout se aplicarán sin que iOS 'necesite romperse' …