¿Por qué las transformaciones de capas afectan el marco de UIView?

Transformar una UIView afecta su marco. La transformación de la capa de UIView también afecta al marco de las vistas de la misma manera. Entonces, escalando la capa de una vista, escala el marco. Estoy tratando de entender por qué las transformaciones en la capa afectan el marco de vistas (incluso cuando view.layer.masksToBounds = NO está configurado).

 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; NSLog(@"Before: %@", NSStringFromCGRect(view.frame)); // Output: {{0, 0}, {50, 50}} // View transform applied view.transform = CGAffineTransformMakeScale(2, 2); NSLog(@"%@", NSStringFromCGRect(view.frame)); // Output: {{-25, -25}, {100, 100}} // Layer transform applied view.transform = CGAffineTransformIdentity; view.layer.transform = CATransform3DMakeScale(2, 2, 1); NSLog(@"%@", NSStringFromCGRect(view.frame)); // Output: {{-25, -25}, {100, 100}} 

No debe mirar el valor del marco una vez que tiene una transformación, ya que está indefinido lo que contiene en ese punto. Esto se menciona en la documentation de la propiedad de frame en UIView :

ADVERTENCIA

Si la propiedad de transform no es la transformación de identidad, el valor de esta propiedad no está definido y, por lo tanto, debe ignorarse.

Si necesita eso para modificar el marco, debe hacerlo usando las properties center y bounds en su lugar.

Un frame es una cosa muy específica.

Este rectángulo define el tamaño y la position de la vista en el sistema de coorderadas de su supervisor. Utiliza este rectángulo durante las operaciones de layout para dimensionar y ubicar la vista.

Las transformaciones aplicadas a una vista afectan el origen y el tamaño de esa vista en la supervisión, razón por la cual cambia el marco de la vista.

La transformación de subvistas afectará a los frameworks de las subvistas, pero no al marco de su supervista.


Vale la pena señalar que los bounds difieren del frame en este aspecto. Los límites de una vista son el origen y el tamaño de una vista dentro de su propio sistema de coorderadas. Las transformaciones no deben cambiar los límites de una vista, ya que la transformación cambia el tamaño y la location de la vista para las coorderadas externas, pero no las coorderadas internas de la vista.

El marco es una propiedad informática. Básicamente, se sintetiza desde el centro y los límites. (Para saber más, busque anchorPoint de CALayer). Además, cuando se toma en consideración la transformación. El marco será un cuadro delimitador que cubrirá el cuadro original, incluso se aplicará rotation o escala. Y la implementación pnetworkingeterminada de hitTest y pointInside utilizará el marco final, lo que significa que puede tocar la vista traducida o girada normalmente.