ios - UIView/CALayer: Transformar desencadena layoutSubviews en superview
viewdidlayoutsubviews (1)
Apple me respondió a través de TSI (personalmente creo que esto es basura):
Parte 1
¿Por qué estoy viendo este comportamiento? ¿Es esta inconsistencia o estoy malinterpretando algunos conceptos centrales?
Una vista se marcará para el diseño cada vez que el sistema sienta que algo ha cambiado y requiere que la vista vuelva a calcular los marcos de sus subvistas. Esto puede ocurrir con más frecuencia de la que se espera y exactamente cuando el sistema elige marcar una vista como requisito de diseño es un detalle de la implementación.
¿Por qué cae en cascada hacia arriba la jerarquía de vistas?
En general, el cambio de una propiedad geométrica de una vista (o capa) desencadenará una cascada de invalidaciones de diseño en la jerarquía de vistas, ya que las vistas principales pueden tener restricciones de Diseño automático relacionadas con el elemento secundario modificado. Tenga en cuenta que el diseño automático está activo de alguna forma, independientemente de si lo ha habilitado explícitamente.
¿Cómo puedo evitar la supervisión de layoutSubviews cada vez que cambio la transformación?
No hay manera de evitar este comportamiento. Es parte de la contabilidad interna de UIKit que se requiere para mantener la jerarquía de vistas coherente.
Parte 2
Hola Håvard,
Pero si esto es cierto, realmente no puedo entender por qué esto no se aplica a ''layer.anchorPoint'' y ''center'' / ''layer.position''.
Puede ser que seamos más conservadores en este caso. Las vistas de los padres no tienen que preocuparse por la posición de sus hijos, excepto cuando se involucra el diseño automático. Y si el diseño automático estuviera involucrado, necesitaría modificar las restricciones directamente para producir un ajuste duradero en la posición de todos modos.
Esta transformación desencadena layoutSubviews que nuevamente se conecta en cascada hacia arriba.
Tengo entendido que un cambio en la transformación solo invalida el diseño del elemento primario inmediato de la vista (a menos que tenga restricciones de configuración para la vista cambiada, entonces se vuelve más complicado). Además, las invalidaciones de diseño se agrupan por lo que el método de subvista de diseño de sus padres solo debe llamarse una vez por transacción (marco). Aún así, puedo entender que esto puede causar problemas de rendimiento si su lógica de diseño es complicada.
¿Algunas ideas?
Envuelve el contenido de tu celda en una vista intermedia. Cuando modifica la transformación de esta vista intermedia, solo se debe invalidar el diseño de la celda, por lo que no se llamará a su costoso método de diseño.
Si eso no funciona, cree algún mecanismo para señalar a su costoso método de diseño cuando realmente (o no) tiene que funcionar. Esta podría ser una propiedad que establezca cuando los únicos cambios que realice sean los de las transformaciones.
Al cambiar algunas de las propiedades de UIView, se layoutSubviews
las vistas de layoutSubviews
en la vista de supervisión . No puedo encontrar ninguna declaración sobre esto en los documentos.
Estas propiedades activan el diseño en superview y self.
- cuadro
- límites
Estas propiedades activan el diseño solo en supervisión.
- transformar
- capa.transformar
Estas propiedades activan el diseño solo en uno mismo.
- ninguna
Estas propiedades no activan ningún diseño.
- centrar
- layer.anchorPoint
- capa.posicion
- alfa
Me parece muy confuso que la transformación está activando el diseño y que la posición y anchorPoint no lo hacen.
Código de ejemplo : https://github.com/hfossli/LayoutSubviewsInconsistency
Quiero saber:
- porque estoy viendo este comportamiento
- Si esto realmente es una inconsistencia o si estoy malinterpretando algunos conceptos básicos
- cómo evitar la supervisión de layoutSubviews cada vez que cambio la transformación
No puedo encontrar nada sobre esto en los documentos ni en los archivos de encabezado. El problema es importante cuando se utiliza UIDynamics o similar.