为什么图层转换会影响 UIView 的框架?
Why do layer transforms affect a UIView's frame?
变换 UIView 会影响其框架。转换 UIView 的图层也会以相同的方式影响视图框架。所以缩放视图的层,缩放框架。我试图理解为什么转换到图层会影响视图框架(即使设置了 view.layer.masksToBounds = NO
)。
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}}
框架是计算属性。
基本上是center和bounds合成的。(更多信息请搜索CALayer的anchorPoint)。
更重要的是,当考虑到转换时。框架将是一个边界框,它将覆盖原始框,甚至应用旋转或缩放。
而 hitTest 和 pointInside 的默认实现将使用最终帧,这意味着您可以正常触摸平移或旋转视图。
一个frame
是一个非常具体的东西。
This rectangle defines the size and position of the view in its superview’s coordinate system. You use this rectangle during layout operations to size and position the view.
应用于视图的变换会影响父视图中该视图的原点和大小,这就是视图框架发生变化的原因。
变换子视图会影响子视图的框架,但不会影响其父视图的框架。
值得注意的是 bounds
在这方面不同于 frame
。视图的边界是视图在其自己的坐标系中的原点和大小。变换不应更改视图的边界,因为变换会更改视图外部坐标的大小和位置,但不会更改视图的内部坐标。
你不应该在你有一个转换后查看帧值,因为它在那个时候包含的内容是未定义的。 documentation for the frame
property on UIView:
中提到了这一点
WARNING
If the transform
property is not the identity transform, the value of this property is undefined and therefore should be ignored.
如果您需要修改框架,则必须改用 center
和 bounds
属性。
变换 UIView 会影响其框架。转换 UIView 的图层也会以相同的方式影响视图框架。所以缩放视图的层,缩放框架。我试图理解为什么转换到图层会影响视图框架(即使设置了 view.layer.masksToBounds = NO
)。
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}}
框架是计算属性。 基本上是center和bounds合成的。(更多信息请搜索CALayer的anchorPoint)。 更重要的是,当考虑到转换时。框架将是一个边界框,它将覆盖原始框,甚至应用旋转或缩放。 而 hitTest 和 pointInside 的默认实现将使用最终帧,这意味着您可以正常触摸平移或旋转视图。
一个frame
是一个非常具体的东西。
This rectangle defines the size and position of the view in its superview’s coordinate system. You use this rectangle during layout operations to size and position the view.
应用于视图的变换会影响父视图中该视图的原点和大小,这就是视图框架发生变化的原因。
变换子视图会影响子视图的框架,但不会影响其父视图的框架。
值得注意的是 bounds
在这方面不同于 frame
。视图的边界是视图在其自己的坐标系中的原点和大小。变换不应更改视图的边界,因为变换会更改视图外部坐标的大小和位置,但不会更改视图的内部坐标。
你不应该在你有一个转换后查看帧值,因为它在那个时候包含的内容是未定义的。 documentation for the frame
property on UIView:
WARNINGIf the
transform
property is not the identity transform, the value of this property is undefined and therefore should be ignored.
如果您需要修改框架,则必须改用 center
和 bounds
属性。