转换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}}
答案 0 :(得分:6)
一旦进行了变换,就不应该查看帧值,因为它未定义在那时包含的内容。这在documentation for the frame
property on UIView:
警告如果
transform
属性不是标识转换,则此属性的值未定义,因此应忽略。
如果您需要修改框架,则必须使用center
和bounds
属性来修改框架。
答案 1 :(得分:1)
frame
是一个非常具体的事情。
此矩形在其superview的坐标系中定义视图的大小和位置。您可以在布局操作期间使用此矩形来调整视图的大小和位置。
应用于视图的变换会影响超视图中该视图的原点和大小,这就是视图框架发生变化的原因。
变换子视图将影响子视图的帧,但不影响其超视图的帧。
值得注意的是bounds
在这方面与frame
不同。视图的边界是视图在其自身坐标系中的原点和大小。变换不应更改视图的边界,因为变换会更改外部坐标视图的大小和位置,但不会更改视图的内部坐标。
答案 2 :(得分:0)
框架是计算属性。 基本上,它是从中心和边界合成的。(要了解更多信息,请搜索CALayer的anchorPoint)。 还有什么,当考虑到变换时。框架将是一个覆盖原始框的边界框,甚至应用旋转或缩放。 而hitTest和pointInside的默认实现将使用最终帧,这意味着您可以正常触摸已翻译或旋转的视图。