Estoy usando Xcode 6 Beta 3, iOS 8 SDK. Construye Target iOS 7.0 usando Swift. Consulte mi problema paso a paso con las capturas de pantalla a continuación.
Tengo un UICollectionView en Storyboard. 1 Prototype UICollectionViewCell que contiene 1 etiqueta en el centro (sin regla de autoresizing). Supongo que el fondo púrpura debía marcar una vista de contenido generada en tiempo de ejecución por la celda. Esa vista se redimensionará correctamente en función de mi UICollectionViewLayoutDelegate eventualmente, pero no en iOS 7. Tenga en cuenta que estoy usando Xcode 6 y el problema solo ocurre en iOS 7.
Cuando construyo la aplicación en iOS 8. Todo está bien.
Nota: Purple es contentView , Blue es mi UIButton con esquina redondeada.
Sin embargo, en iOS 7, todas las subvistas dentro de la celda se reducen repentinamente al marco de (0,0,50,50) y nunca más se ajustan a mi regla de Autoresizing.
Supongo que esto es un error en iOS 8 SDK o Swift o tal vez Xcode.
Actualización 1: ¡ Este problema todavía existe en el Xcode 6.0.1 oficial! La mejor solución es como lo que KoCMoHaBTa sugirió a continuación al establecer el marco en cellForItem de la celda (aunque debe subclasificar su celda). Resultó que esto es una incompatibilidad entre iOS 8 SDK e iOS 7 (verifique la respuesta de ecotax a continuación citada por Apple).
Actualización 2: pegue este código al comienzo de su cellForItem y las cosas deberían estar bien:
/** Xcode 6 on iOS 7 hot fix **/
cell.contentView.frame = cell.bounds;
cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
/** End of Xcode 6 on iOS 7 hot fix **/
fuente
contentView
de tamaño con la celda funciona bien para solucionar el problema. Supongo que en iOS 8 Apple cambió algo sobre la forma en que se manejan las vistas de contenido celular cuando se crea en Interface Builder (que de todos modos todavía es un poco un cuadro negro). Pero el hecho de que cambie el comportamiento al apuntar a iOS 7 seguramente es un error.contentView
bordes a los bordes de la celda.Respuestas:
contentView está roto. También puede repararse en wakekeFromNib
ObjC:
Swift3:
fuente
Encontré el mismo problema y le pedí ayuda a Apple DTS. Su respuesta fue:
Supongo que esto significa que no es un error en XCode 6, sino una incompatibilidad entre el SDK de iOS 8 y el SDK de iOS 7, que te afectará si actualizas a Xcode 6, porque automáticamente comenzará a usar el SDK de iOS 8.
Como comenté antes, la solución que Daniel Plamann describió funciona para mí. Sin embargo, las descritas por Igor Palaguta y KoCMoHaBTa parecen más simples y parecen tener sentido al dar la respuesta de Apple DTS, así que las intentaré más adelante.
fuente
Encontré el mismo problema y espero que Apple solucione esto con la próxima versión de Xcode. Mientras tanto, uso una solución alternativa. En mi
UICollectionViewCell
subclase, he anuladolayoutSubviews
y redimensionado manualmente contentView en caso de que el tamaño difiera delcollectionViewCell
tamaño.fuente
[cell layoutIfNeeded];
en cellForItem o cellForRow?Otra solución es establecer el tamaño de contentView y las máscaras de autorización de
-collectionView:cellForItemAtIndexPath:
la siguiente manera:Esto también funciona con el diseño automático, ya que las máscaras de cambio de tamaño automático se traducen en restricciones.
fuente
En Xcode 6.0.1, contentView para UICollectionViewCell está roto para dispositivos iOS7. También se puede solucionar agregando restricciones adecuadas a UICollectionViewCell y su contentView en los métodos awakeFromNib o init.
fuente
Esto no funcionará correctamente sin ninguna de las otras soluciones mencionadas debido a un error en Xcode 6 GM con la forma en que Xcode compila los archivos xib en el formato nib. Si bien no puedo decir con 100% de certeza que está relacionado con Xcode y no tiene que ver con el tiempo de ejecución, estoy muy seguro: así es como puedo mostrarlo:
Espero que todos los que lean esta pregunta presenten un radar con Apple. Este es un problema ENORME y debe abordarse antes de la versión final de Xcode.
Editar: a la luz de la publicación de ecotax , solo quería actualizar esto para decir que ahora se confirman las diferencias de comportamiento entre construir en iOS 8 vs iOS 7, pero no es un error. Mi truco solucionó el problema porque la construcción en iOS 7 agregó la máscara de tamaño automático a la vista de contenido necesaria para que esto funcione, que Apple ya no agrega.
fuente
Las respuestas en esta publicación funcionan, lo que nunca entendí es por qué funciona.
Primero, hay dos "reglas":
[UIView new]
), La propiedadtranslatesAutoresizingMaskIntoConstraints
se establece enYES
translatesAutoresizingMaskIntoConstraints
establecida enNO
La segunda regla no parece aplicarse a las vistas de nivel superior para las que no define restricciones. (Ej. La vista de contenido)
Al mirar una celda de Storyboard, observe que la celda no está
contentView
expuesta. No estamos "controlando" elcontentView
, Apple lo está.Profundice en el código fuente del guión gráfico y vea cómo
contentView
se define la celda:<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
Ahora las subvistas de la celda (observe el
translatesAutoresizingMaskIntoConstraints="NO"
):<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NaT-qJ-npL" userLabel="myCustomLabel">
El
contentView
no tiene estátranslatesAutoresizingMaskIntoConstraints
configurado enNO
. Además, carece de definición de diseño, tal vez por lo que dijo @ecotax .Si nos fijamos en el
contentView
, tiene una máscara de autoresizing, pero no tiene una definición:<autoresizingMask key="autoresizingMask"/>
Entonces hay dos conclusiones:
contentView
translatesAutoresizingMaskIntoConstraints
está ajustado aYES
.contentView
carece de definición de un diseño.Esto nos lleva a dos soluciones de las que se ha hablado.
Puede configurar las máscaras de tamaño automático manualmente en
awakeFromNib
:O puede establecer la
contentView
translatesAutoresizingMaskIntoConstraints
aNO
enawakeFromNib
y definir restricciones en- (void)updateConstraints
.fuente
Esta es la versión Swift de la respuesta de @ Igor que es aceptada y gracias por su buena respuesta compañero.
Primero vaya a su
UICollectionViewCell
subclase y pegue el siguiente código, ya que está dentro de la clase.Por cierto, estoy usando Xcode 7.3.1 y Swift 2.3. La solución se ha probado en iOS 9.3, que funciona perfectamente.
Gracias, espero que esto haya ayudado.
fuente
En swift, coloque el siguiente código en la subclase de celdas de la vista de colección:
fuente
He descubierto que también hay problemas con el
contentView
tamaño en iOS 8. Tiende a presentarse muy tarde en el ciclo, lo que puede causar conflictos de restricción temporales. Para resolver esto, agregué el siguiente método en una categoría deUICollectionViewCell
:Este método debe llamarse después de quitar la célula.
fuente
dequeueReusableCellWithReuseIdentifier:forIndexPath:
.Lo arreglé haciendo esto:
ver: aquí
fuente
Solo asegúrese de marcar la casilla de verificación "Autoresize subviews" en la punta de esa celda de vista de colección. Funcionará bien tanto en iOS 8 como en iOS 7.
fuente