Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么图层变换会影响UIView';什么样的框架?_Ios_Objective C_Cocoa Touch_Uiview_Catransform3d - Fatal编程技术网

Ios 为什么图层变换会影响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的默认实现将使用最终帧,这意味着您可以正常触摸平移或旋

变换UIView会影响其框架。变换UIView的图层也会以相同的方式影响视图框架。因此,缩放视图的层,缩放帧。我试图理解为什么层的转换会影响视图框架(即使设置了
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}}