Ios 为什么图层变换会影响UIView';什么样的框架?
变换UIView会影响其框架。变换UIView的图层也会以相同的方式影响视图框架。因此,缩放视图的层,缩放帧。我试图理解为什么层的转换会影响视图框架(即使设置了Ios 为什么图层变换会影响UIView';什么样的框架?,ios,objective-c,cocoa-touch,uiview,catransform3d,Ios,Objective C,Cocoa Touch,Uiview,Catransform3d,变换UIView会影响其框架。变换UIView的图层也会以相同的方式影响视图框架。因此,缩放视图的层,缩放帧。我试图理解为什么层的转换会影响视图框架(即使设置了view.layer.masksToBounds=NO) 框架是一种计算属性。 基本上,它是从中心和边界合成的。(要了解更多信息,请搜索CALayer的主播点)。 更重要的是,当考虑到变换时。框架将是一个边界框,覆盖原始框,即使应用了旋转或缩放。 hitTest和pointInside的默认实现将使用最终帧,这意味着您可以正常触摸平移或旋
view.layer.masksToBounds=NO
)
框架是一种计算属性。 基本上,它是从中心和边界合成的。(要了解更多信息,请搜索CALayer的主播点)。 更重要的是,当考虑到变换时。框架将是一个边界框,覆盖原始框,即使应用了旋转或缩放。 hitTest和pointInside的默认实现将使用最终帧,这意味着您可以正常触摸平移或旋转视图。A是一个非常具体的东西 此矩形定义视图在其superview坐标系中的大小和位置。您可以在布局操作期间使用此矩形来调整视图的大小和位置 应用于视图的变换会影响superview中该视图的原点和大小,这就是视图的帧发生更改的原因 变换子视图将影响子视图的帧,但不会影响其superview的帧
值得注意的是,在这方面与
frame
不同。视图的边界是视图在其自身坐标系内的原点和大小。变换不应更改视图的边界,因为变换会更改视图外部坐标的大小和位置,但不会更改视图的内部坐标。一旦进行变换,就不应查看帧值,因为它在该点包含的内容尚未定义。这在以下文件中提到:
警告
如果transform
属性不是标识转换,则此属性的值未定义,因此应忽略
如果需要修改帧,则必须使用
center
和bounds
属性进行修改。奇怪的是,帧通常是显式设置的,但也是计算属性。这在hitTest
或pointInside
的上下文中是有意义的!感谢Jeffery,我知道对视图应用变换会影响其框架,我想了解的是为什么对视图层应用变换会影响其框架。在UIView上的frame
属性文档中:警告:如果transform
属性不是标识转换,则此属性的值未定义,因此应忽略。一旦进行转换,就不应查看帧值。从UIView上的frame
属性文档中:警告如果transform
属性不是标识转换,则此属性的值未定义,因此应忽略。“谢谢你@DavidRönnqvist。这正是我需要听到的解释。如果您回答这个问题,我将接受。此文档引用的是view.transform
属性。它没有说明view.layer.transform
是否影响帧。但从实验来看,它显然是这样的。@Glenn Schmidt,一个UIView
的变换和帧属性都指向它的底层CALayer
,所以所有的东西都应该同样适用。
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}}