Configuración de UICollectionViewCellSize en time de ejecución

Tengo una vista de stack que contiene tres UICollectionViews , configurada para darles espacio vertical igual a cada uno. Esa vista de stack está configurada para que sea la altura de la mitad de la pantalla, de modo que use más espacio en dispositivos más grandes. Esto se ha configurado en Interface Builder.

Por lo tanto, necesito configurar el tamaño de celda de UICollectionView en time de ejecución, ya que hasta que nos estamos ejecutando, no sé cuál será el tamaño real de las celdas. Quiero que sean cuadradas, así que solo quiero tener en count la altura de UICollectionView , restar las inserciones de la sección superior e inferior y establecer el itemSize en el tamaño resultante.

Intento hacer esto en viewDidLayoutSubviews , ya que para entonces considero que las alturas iniciales de las vistas de la colección se han establecido. Sin embargo, parecen estar configurados en 1000×1000 (aunque son un tamaño mucho más razonable en el guión gráfico), por lo que calculo un tamaño de celda basado en una altura de vista de colección de 1000. Esto es demasiado grande, pero creo que Me volverán a llamar y tendré otra oportunidad para volver a calcularlo. Y lo hago, pero no antes de que UICollectionView queje en voz alta de que el itemSize es incorrecto (es decir, demasiado grande para caber en la collectionView , que ahora tiene el tamaño "correcto").

¿Cuál es la mejor manera de get el comportamiento que estoy buscando sin las advertencias de UICollectionView ? Configurar el tamaño del elemento de la vista de colección en time de ejecución en function del tamaño eventual de UICollectionView es algo con lo que he luchado en el pasado, y nunca parece haber el momento "correcto" para establecer el elemento itemSize . No quiero devolverlo dinámicamente, aunque sea solo porque no es algo que cambie durante la vida del progtwig. Simplemente parece haber algunas inconsistencias que ocurren cuando se presentan las vistas inicialmente.

Me parece raro que la vista de colección incluya un tamaño inicial de 1000.0 por 1000.0, pero no estoy seguro de cómo o por qué arreglar eso, ¿quizás tiene algo que ver con estar embedded en una vista de stack?

Editado para agregar: es casi seguro que UIStackView está causando problemas de layout. UICollectionView un proyecto ficticio para probar el tamaño de un UICollectionView cuando es la vista de nivel superior vs embedded en un UIStackView . Si no está embedded, cuando se llama a viewDidLayoutSubviews , se ha dimensionado correctamente para ajustarse a los límites de su superview . Sin embargo, si está dentro de un UIStackView , permanece en el tamaño pnetworkingeterminado de 1000×1000.

Por ahora, estoy trabajando alnetworkingedor de este problema agregando el siguiente código en viewDidLayoutSubviews :

  if collectionView.bounds.size.width > view.bounds.size.width { view.layoutIfNeeded() } 

Donde collectionView está dentro de un UIStackView y la view es la vista principal del UIViewController . Esto permite que todos los cálculos posteriores basados ​​en el tamaño de la vista sean correctos, y es de esperar que no se llamen si el comportamiento de UIStackView alguna vez se resuelve.

Conversaciones similares aquí y aquí . Es interesante señalar que en XCode8, el nuevo valor pnetworkingeterminado es no save tamaños de vistas en el file XIB, sino que lo trae todo con un tamaño inicial de 1000×1000, que se resolverá durante el primer pase de layout. Excepto UIStackView s, supongo.

¿Tienes sizeForItemAtIndexPath() devuelve itemSize ? Descubrí que la implementación de esa function es la única forma confiable de dimensionar un UICollectionViewCell dinámicamente en time de ejecución.