uicollectionviewflowlayoutautomaticsize uicollectionviewdelegateflowlayout automatic ios objective-c xcode autolayout uicollectionview

ios - uicollectionviewdelegateflowlayout - Extraño comportamiento de autolayout en vistas de colección



uicollectionview swift 4 (6)

Bueno, el mensaje de advertencia da una pista de lo que está mal.

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa98103b8d0 UIImageView:0x7fa9810375d0.centerY == UIImageView:0x7fa981037490.centerY>

Entonces, para analizar, tiene dos objetos basados ​​en vista. Uno está configurado para centrarse de arriba abajo en la otra vista (0x7fa9810375d0 a 0x7fa981037490 - estos son los ID de las vistas)

Pero también ver id 0x7fa981037490 tiene otra restricción,

<NSLayoutConstraint:0x7fa98103ba60 UIImageView:0x7fa981037490.top == UIView:0x7fa9810371d0.topMargin + 71>

Lo que parece que la parte superior de 0x7fa981037490 se alinea en la parte superior de la vista 0x7fa9810371d0 más 71 puntos.

No he descargado su proyecto, pero apostaría que ahí es donde radica el problema. La mejor suposición es que las restricciones del centro no se pueden cumplir porque la parte superior de alineación mueve el ImageView a un lugar que lo rompe. Trata de ver lo que has establecido en restricciones visualmente en tu cabeza. Ha alineado con ImageViews y alineado uno de ellos al borde de otra vista. ¿Cómo se romperá eso? (es lo que deberías preguntarte)

Intente eliminar una restricción de a una por vez y compilar y ejecutar. Si la advertencia se va, esa es la que necesita reparación. Sí, la vista puede parecer extraña y puede usar Command + Z para deshacer la eliminación de las restricciones una por una.

Darle una oportunidad. Házmelo saber

Tengo un problema con el diseño automático, la consola está informando problemas con una vista de imagen que tengo en una celda:

RefreshCatalogue[31754:16177989] 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:0x7fa98103b740 V:[UIImageView:0x7fa9810375d0]-(0)-| (Names: ''|'':UIView:0x7fa9810371d0 )>", "<NSLayoutConstraint:0x7fa98103b7e0 V:|-(0)-[UIImageView:0x7fa9810375d0] (Names: ''|'':UIView:0x7fa9810371d0 )>", "<NSLayoutConstraint:0x7fa98103b8d0 UIImageView:0x7fa9810375d0.centerY == UIImageView:0x7fa981037490.centerY>", "<NSLayoutConstraint:0x7fa98103ba60 UIImageView:0x7fa981037490.top == UIView:0x7fa9810371d0.topMargin + 71>", "<NSAutoresizingMaskLayoutConstraint:0x7fa980d44a10 h=--& v=--& V:[UIView:0x7fa9810371d0(50)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa98103b8d0 UIImageView:0x7fa9810375d0.centerY == UIImageView:0x7fa981037490.centerY> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

El problema es que si lo hago:

[self.collectionView reloadItemsAtIndexPaths:@[indexPath]];

No se muestra nada, aunque la vista de la imagen parece tener el fotograma correcto, la propiedad de la imagen está configurada. Si vuelvo a cargar toda la vista de la colección con:

[self.collectionView reloadData];

El error sigue ahí, pero la imagen muestra. El código está abierto aquí si alguien está interesado en echar un vistazo: https://github.com/Ridiculous-Innovations/RefreshCatalogue

Además, todas las restricciones en el story board parecen estar en azul. ¿Alguna idea de lo que podría estar causando el problema?

Edición: No hace falta decir que todos los elementos, incluida la vista de imagen, están en el lugar correcto (depuré marcos y establecí colores aleatorios) pero la imagen no se visualizó hasta que se actualizó ... a veces las celdas no se muestran en absoluto


Prueba esto, me ayuda a eliminar esas interrupciones de restricción en la consola.

yourCustomCell.contentView.frame = yourCustomCell.bounds;


Puntos de vista:

UIView:0x7fa9810371d0 , vamos a nombrarlo container
UIImageView:0x7fa9810375d0 , UIImageView:0x7fa9810375d0 el nombre image1
UIImageView:0x7fa981037490 , vamos a UIImageView:0x7fa981037490 image2 .

No vamos a inspeccionar las restricciones

La height contenedor es 50 , especificada por el ajuste automático. La altura probablemente no esté especificada por su vista de colección. Lo más probable es que este sea el tamaño de la celda cuando se crea antes de cambiar su tamaño al tamaño especificado por el diseño de la vista de colección.

image2 está a 71 puntos debajo de la parte superior del contenedor, por lo que está al menos a 21 puntos debajo del borde inferior del contenedor.

image1 parte inferior de la image1 está alineada con el fondo del contenedor, por lo que está sobre el borde inferior del contenedor.

Ahora su última restricción centra image1 e image2 verticalmente por lo que obviamente hay una colisión.

Es un poco difícil saber qué estás tratando de hacer, pero supongo que deberías posicionar solo la image1 relativa al contenedor y la única restricción vertical para la image2 debería ser la que los centra verticalmente.

Demasiado para ver los errores en Interface Builder, cambie la altura de su celda a 50 , verá todo fragmentado. Solo hay algunas restricciones innecesarias que causan conflicto al cambiar el tamaño.

También hay algunas restricciones que no están instaladas para la clase de tamaño actual. Es posible que esté ejecutando la aplicación en un simulador de una clase de tamaño diferente y los tenga instalados. Eso significa que incluso hay algunas colisiones adicionales.


Tiene un problema con UIImageView: 0x7fa981037490.top == UIView: 0x7fa9810371d0.topMargin + 71 y el cuadro principal con 0 de altura (por lo que la altura de la vista de la imagen debe ser negativa, pero esto no está permitido), como justo después de llamar al método dequeueReusableCell. La solución posible para este caso es cambiar la prioridad de 1000 a 999 en la restricción más baja en la vista anidada (Espacio vertical - CatalogueHeaderCell - Vista de imagen y Espacio vertical - catalogueCell - Vista de información).


revise su imageView centerY constricción

elimine esta restricción ... este problema se produce debido a la limitación de la ambigüedad. al agregar el diseño automático, debe aplicar la restricción de diseño automático adecuada a imageView.

Después de eliminar centreY constricción si hay ambigüedad, entonces xcode volverá a mostrar el mismo error, nuevamente debe eliminar la restricción ambigua.


En la segunda celda, algunas restricciones están deshabilitadas. eso significa que las restricciones se eliminan para Cualquier altura Cualquier ancho. así que cuando ejecutas la aplicación en iPhone, las restricciones entran en conflicto con tus restricciones actuales.

por lo tanto, elimine las restricciones de desactivación resaltadas.