Estoy usando restricciones de diseño automático mediante programación para diseñar mis celdas UITableView personalizadas y estoy definiendo correctamente los tamaños de celda en tableView:heightForRowAtIndexPath:
Funciona bien en iOS6 y también se ve bien en iOS7
PERO cuando ejecuto la aplicación en iOS7, este es el tipo de mensaje que veo en la consola:
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2013-10-02 09:56:44.847 Vente-Exclusive[76306:a0b] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0xac4c5f0 V:|-(15)-[UIImageView:0xac47f50] (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSLayoutConstraint:0xac43620 V:[UIImageView:0xac47f50(62)]>",
"<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>",
"<NSLayoutConstraint:0xac43680 V:[UIView:0xac4d0f0(1)]>",
"<NSLayoutConstraint:0xac436b0 V:[UIView:0xac4d0f0]-(0)-| (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>
Y, de hecho, hay una de las restricciones en esa lista que no quiero:
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
y no puedo establecer la translatesAutoresizingMaskIntoConstraints
propiedad del contentView
en NO => estropearía toda la celda.
44 es la altura de celda predeterminada, pero definí mis alturas personalizadas en el delegado de vista de tabla, entonces, ¿por qué la celda contentView tiene esta restricción? Que podria causar esto?
En iOS6 no está sucediendo y todo se ve bien tanto en iOS6 como en iOS7.
Mi código es bastante grande, por lo que no lo publicaré aquí, pero no dude en solicitar un pastebin si lo necesita.
Para especificar cómo lo estoy haciendo, en la inicialización de la celda:
- Creo todas mis etiquetas, botones, etc.
- Configuré su
translatesAutoresizingMaskIntoConstraints
propiedad en NO - Los agrego como subvistas
contentView
de la celda. - Añado las restricciones en el
contentView
También estoy profundamente interesado en comprender por qué esto sucede solo en iOS7.
Respuestas:
También tuve este problema ... Parece que el marco de contentView no se actualiza hasta que
layoutSubviews
se llama, sin embargo, el marco de la celda se actualiza antes, dejando el marco de contentView configurado{0, 0, 320, 44}
en el momento en que se evalúan las restricciones.Después de mirar el contentView con más detalle, parece que las máscaras de tamaño automático ya no se configuran.
Configurar la máscara automática antes de restringir sus vistas puede resolver este problema:
fuente
self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
antes de agregar sus restricciones, lo que debería resolver el problema.self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
funciona tan bien como usarself.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
. Puse estoupdateConstraints
antes de agregar las restricciones a mi vista de contenido.Aparentemente, hay algo mal con UITableViewCell y UICollectionViewCell en iOS 7 usando iOS 8 SDK.
Puede actualizar contentView de la celda cuando la celda se reutiliza de esta manera:
Para Static UITableViewController:
Dado que los controladores de vista de tabla estática son frágiles y pueden romperse fácilmente si implementa alguna fuente de datos o métodos deletegate, hay comprobaciones que garantizarán que este código solo se compile y ejecute en iOS 7
Es similar para UITableViewController dinámico estándar:
Para este caso no necesitamos la verificación adicional de compilación, ya que se requiere implementar este método.
La idea es la misma para ambos casos y para UICollectionViewCell, como se comentó en este hilo: El problema de autoresizing del marco de contentView de UICollectionViewCell en la celda del prototipo de Storyboard (Xcode 6, iOS 8 SDK) ocurre cuando se ejecuta solo en iOS 7
fuente
Como las celdas se están reutilizando y la altura puede cambiar en función del contenido, creo que, en general, sería mejor establecer la prioridad de los espacios a menos de lo requerido.
En su caso, UIImageView tiene un espaciado de 15 hacia la parte superior y la vista inferior tiene un espaciado de 0 hacia la parte inferior. Si establece la prioridad de esas restricciones en 999 (en lugar de 1000), la aplicación no se bloqueará porque las restricciones no son necesarias.
Una vez que se llama al método layoutSubviews, la celda tendrá la altura correcta y las restricciones se pueden satisfacer normalmente.
fuente
Sigo sin encontrar una buena solución para guiones gráficos ... También hay información aquí: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
Por lo que aconsejan allí:
He inducido mi solución:
.
.
fuente
Simplemente aumente la altura de celda predeterminada. Parece que el problema es que el contenido de la celda es mayor que el tamaño de celda predeterminado (inicial), violando algunas restricciones de no negatividad hasta que la celda cambia de tamaño a su tamaño real.
fuente
UITableViewCellScrollView
) entre la celda de vista de tabla y contentView; eso probablemente explica la diferencia entre iOS 6 y 7 aquí.Tal vez establezca la prioridad de la vista en más de 750 y menos de 1000 puede resolver.
fuente
Yo tuve el mismo problema. Mi solución basada en otras anteriores:
Saludos, Alessandro
fuente
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
También he enfrentado este problema y ninguna de las sugerencias ayudó. En mi caso, tenía una celda de selección de tamaño y contenía collectionView dentro (cada celda de collectionView contenía una imagen de tamaño completo). Ahora, la altura del tamaño de celda era un poco mayor (60) que la vista de colección (50) y las imágenes dentro de ella (50). Debido a que la vista collectionView tiene una restricción de alineación inferior a la supervista con un valor de 10. En ese caso, recibo una advertencia, y la única forma de solucionarlo era hacer que la altura de la celda fuera la misma que su collectionView.
fuente
Terminé sin usar UITableViewCell en el diseñador en absoluto ... Creo una vista personalizada y la agrego a la vista de contenido de la celda mediante programación ... Con algunas categorías de ayuda tampoco hay un código repetitivo ...
fuente
Si funciona bien en iOS8 y recibe la advertencia en iOS7, puede buscar el código fuente del guión gráfico y encontrar el tableviewCell correcto, luego agregar el atributo rect después de la línea tableviewCell. Gracias a kuchumovn .
fuente