ios uitableview uilabel autolayout ios7.1

El contenido de iOS 7.1 UitableviewCell se superpone con los que se muestran a continuación



uilabel autolayout (6)

Así que tengo un código que funciona con éxito en iOS 7.0 pero no en 7.1. Tengo una tabla de vista simple, con código:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 10; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 70.0; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; for (UIView *view in cell.contentView.subviews) { [view removeFromSuperview]; } UILabel *label = [[UILabel alloc] init]; label.text = [NSString string]; for (NSInteger i = 0; i < 20; i++) { label.text = [label.text stringByAppendingString:@"label String "]; } label.translatesAutoresizingMaskIntoConstraints = NO; label.numberOfLines = 0; label.lineBreakMode = NSLineBreakByWorldWrapping; //label.lineBreakMode = NSLineBreakByTruncatingTail; //I have tried this too [cell.contentView addSubview:label]; NSDictionary *dict = NSDictionaryOfVariableBindings(label); [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[label]-8-|" options:0 metrics:nil views:dict]]; [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[label]" options:0 metrics:nil views:dict]]; if (indexPath.row == 0) { label.textColor = [UIColor colorWithRed:1.0 green:0 blue:0 alpha:1.0]; } else if (indexPath.row == 1) { label.textColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:1.0]; } else if (indexPath.row == 2) { label.textColor = [UIColor colorWithRed:0 green:0 blue:1.0 alpha:1.0]; } else { label.textColor = [UIColor colorWithWhite:0.3 alpha:1.0]; } cell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0]; return cell; }

Tengo 1 sección con 10rows. Con cada fila reutilizada elimino todas las subvistas de contentView (intenté alloc-init UITableViewCell, pero obtuve los mismos resultados).

En iOS 7.0, UILabel solo se muestra en la celda a la que pertenece. Pero en 7.1 UILabel continúa mostrándose en otras celdas. Lo que es interesante, que cuando hago clic en la celda, deja de superponerse entre sí, pero solo hasta que hago clic en la celda de arriba. Mi pregunta es cómo hacer que funcione en dispositivos 7.1 como en 7.0ones.

Probé tanto el simulador como el dispositivo y eché un vistazo a iOS 7.1 API Diffs, pero no encontré nada relacionado con esto.

Quizás es problema de Auto Layout, que tengo una altura variable de UILabel, pero necesito hacerlo. Quiero tener todo el texto en UILabel, pero mostrar solo una parte de UILabel, que se puede mostrar en una celda, que es el comportamiento predeterminado en 7.0, pero el 7.1 lo cambia y no sé por qué ni cómo lidiar con él.

Esta es una carpeta de Dropbox para imágenes con una explicación detallada: Carpeta con imágenes

Actualización: Intenté cosas como tese, pero nada funcionó para mí.

cell.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70); cell.contentView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70); cell.opaque = NO; cell.contentView.opaque = NO; cell.clearsContextBeforeDrawing = NO; cell.contentView.clearsContextBeforeDrawing = NO; cell.clipsToBounds = NO; cell.contentView.clipsToBounds = NO;


¿Estás usando storyboards? Si es así, seleccione el controlador de vista de tabla en los guiones gráficos y desmarque la opción "En las barras inferiores". También puede hacerlo mediante programación.

Si su TVC hereda de un controlador de vista de navegación o un controlador de vista de pestaña, es posible que deba desmarcar esta opción de diseño en la vista principal en su lugar


Aquí está la solución perfecta de superposición de contenido en las celdas.

Simplemente use el código siguiente en cellForRowAtIndexPath después de asignar la celda y antes de agregar las subvistas.

for (id object in cell.contentView.subviews) { [object removeFromSuperview]; }

En realidad, la superposición se produce porque cada vez que se desplaza por la vista de tabla asigna su vista añadida una y otra vez. Por lo tanto, el código anterior resolverá su problema eliminando las vistas existentes del contenido de la celda.

Ahora puede ver la sesión de depuración de memoria después de aplicar el código anterior, su memoria es estable esta vez.

Espero que te ayude

Gracias !


El problema tiene que ver con la altura de tu celular. No lo ajustará dinámicamente para usted.

Probablemente notará que a medida que se desplaza y la vista de arriba se pierde de vista, el texto superpuesto desaparecerá con él.

Si desea que su texto se recorta a cierta altura, entonces debe establecer el número de líneas, en lugar de establecerlo en 0, ya que eso permitirá que continúe para siempre.

lineBreakMode no tendrá efecto ya que no está detenido.

Opcionalmente, podría tratar de establecer el recorte en contentView para asegurarse de que todas las subvistas permanezcan dentro.

Dependiendo del resultado final que desee, puede hacer alturas dinámicas y cambiar en función del contenido. Hay un montón de preguntas SO relacionadas con hacer esto.

Actualizar - recorte de contenido

Tendría que probarlo yo mismo, pero en lugar de eso, aquí hay un par de enlaces relacionados con el recorte de contentView:

Parece que esto funciona:

cell.clipsToBounds = YES;


Este es un problema al recrear el contenido de la celda. Pruebe con el siguiente segmento de código.

for(UIView *view in cell.contentView.subviews){ if ([view isKindOfClass:[UIView class]]) { [view removeFromSuperview]; } }


tuvo un comportamiento similar en iOS 8, usando storyboard / IB.

la solución consistía en agregar una restricción de Bottom Space to: Superview desde la vista inferior hasta la parte inferior de la vista de contenido de la celda del prototipo. Las otras vistas y restricciones estaban todas ancladas desde la parte superior.


@Gaurav su respuesta debería ser la respuesta aceptada. ¡Gracias!

for object in cell.contentView.subviews { object.removeFromSuperview(); }