Tengo un UIView
que tiene alrededor de 8 CALayer
subcapas diferentes agregadas a su capa. Si modifico los límites de la vista (animados), entonces la vista en sí se encoge (lo verifiqué con a backgroundColor
), pero el tamaño de las subcapas permanece sin cambios .
¿Cómo solucionar esto?
UITextView
(scrollEnabled = NO) y un diseño automático. Tenía una vista de texto fijada a su supervista, que a su vez tenía unaCALayer
en la parte inferior de sí misma (un borde), y quería que actualizara la posición del borde cuando cambiaba la altura de la vista de texto. Por alguna razón,layoutSubiews
se llamó demasiado tarde (y la posición de la capa se animó).Dado que CALayer en el iPhone no admite administradores de diseño, creo que debe hacer que la capa principal de su vista sea una subclase CALayer personalizada en la que anula
layoutSublayers
para establecer los marcos de todas las subcapas. También debe anular el+layerClass
método de su vista para devolver la clase de su nueva subclase CALayer.fuente
Usé esto en UIView.
Funciona para mi.
fuente
CALayerDelegate
'sdraw(_:in:)
), tuve que llamar también_anySubLayer.setNeedsDisplay()
. Entonces esto funcionó para mí.Yo tuve el mismo problema. En la capa de una vista personalizada, agregué dos subcapas más. Para cambiar el tamaño de las subcapas (cada vez que cambian los límites de la vista personalizada), implementé el método
layoutSubviews
de mi vista personalizada; dentro de este método, simplemente actualizo el marco de cada subcapa para que coincida con los límites actuales de la capa de mi subvista.Algo como esto:
fuente
2017
La respuesta literal a esta pregunta:
"No se cambió el tamaño de CALayers en el cambio de límites de su UIView. ¿Por qué?"
es que para bien o para mal
needsDisplayOnBoundsChange
por defecto es falso en
CALayer
.solución,
De hecho, te dirijo a este QA
https://stackoverflow.com/a/47760444/294884
lo que explica, qué diablos hace el
contentsScale
escenario crítico ; por lo general, debe establecerlo igualmente cuando establece needDisplayOnBoundsChange.fuente
Versión Swift 3
En la celda personalizada, agregue las siguientes líneas
Declarar primero
Luego agrega las siguientes líneas
fuente
Como [Ole] escribió, CALayer no admite el tamaño automático en iOS. Por lo tanto, debe ajustar el diseño manualmente. Mi opción fue ajustar el marco de la capa dentro (iOS 7 y anteriores)
o (a partir de iOS 8)
fuente
En su vista personalizada, necesita declarar la variable para su capa personalizada, no declare la variable en el alcance init. Y simplemente inícielo una vez, no intente establecer un valor nulo y reiniciar
fuente