Tengo un UIViewque tiene alrededor de 8 CALayersubcapas 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 unaCALayeren 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,layoutSubiewsse 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
layoutSublayerspara establecer los marcos de todas las subcapas. También debe anular el+layerClassmé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
layoutSubviewsde 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
needsDisplayOnBoundsChangepor 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
contentsScaleescenario 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
class CustomView: UIView { var customLayer: CALayer = CALayer () anular func layoutSubviews () { super.layoutSubviews () // guard let _fillColor = self._fillColor else {return} initializeLayout () } private func initializeLayout () { customLayer.removeFromSuperView () customLayer.frame = layer.bounds layer.insertSubview (en: 0) } }fuente