为什么图层变换会影响UIView的帧?

时间:2015-04-09 02:20:05

标签: ios objective-c cocoa-touch uiview catransform3d

转换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}}

3 个答案:

答案 0 :(得分:6)

一旦进行了变换,就不应该查看帧值,因为它未定义在那时包含的内容。这在documentation for the frame property on UIView

中提到
  警告      

如果transform属性不是标识转换,则此属性的值未定义,因此应忽略。

如果您需要修改框架,则必须使用centerbounds属性来修改框架。

答案 1 :(得分:1)

frame是一个非常具体的事情。

  

此矩形在其superview的坐标系中定义视图的大小和位置。您可以在布局操作期间使用此矩形来调整视图的大小和位置。

应用于视图的变换会影响超视图中该视图的原点和大小,这就是视图框架发生变化的原因。

变换子视图将影响子视图的帧,但不影响其超视图的帧。


值得注意的是bounds在这方面与frame不同。视图的边界是视图在其自身坐标系中的原点和大小。变换不应更改视图的边界,因为变换会更改外部坐标视图的大小和位置,但不会更改视图的内部坐标。

答案 2 :(得分:0)

框架是计算属性。 基本上,它是从中心和边界合成的。(要了解更多信息,请搜索CALayer的anchorPoint)。 还有什么,当考虑到变换时。框架将是一个覆盖原始框的边界框,甚至应用旋转或缩放。 而hitTest和pointInside的默认实现将使用最终帧,这意味着您可以正常触摸已翻译或旋转的视图。