【问题标题】:Why do layer transforms affect a UIView's frame?为什么图层变换会影响 UIView 的框架?
【发布时间】:2015-06-14 05:41:27
【问题描述】:

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

【问题讨论】:

  • 一旦你有一个变换,你不应该看帧值。来自 UIView 上 frame 属性的文档:“警告如果 transform 属性不是身份转换,则此属性的值未定义,因此应忽略。”
  • 谢谢@DavidRönnqvist。这正是我需要听到的那种解释。如果您将此作为答案,我会接受。

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


【解决方案1】:

一旦进行了变换,就不应查看帧值,因为此时它包含的内容是未定义的。 documentation for the frame property on UIView中提到了这一点:

警告

如果transform 属性不是恒等变换,则该属性的值是未定义的,因此应该被忽略。

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

【讨论】:

  • 本文档指的是view.transform 属性。它没有说view.layer.transform 是否会影响框架。但从实验来看,它显然确实如此。
  • @Glenn Schmidt,UIViewtransformframe 属性指向和指向其底层 CALayer,因此所有内容都应该同样适用。
【解决方案2】:

frame 是一个非常具体的东西。

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

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

转换子视图会影响子视图的框架,但不会影响其父视图的框架。


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

【讨论】:

  • 谢谢 Jeffery,我知道对视图应用变换会影响其框架,我想了解的是为什么对视图层应用变换会影响其框架。
  • 来自 UIView 上frame 属性的文档:“警告:如果transform 属性不是身份转换,则此属性的值未定义,因此应忽略。”
【解决方案3】:

框架是一种计算属性。 基本上是由center和bounds合成的(想了解更多请搜索CALayer的anchorPoint)。 更重要的是,当考虑到变换时。框架将是一个覆盖原始框的边界框,即使应用了旋转或缩放。 而hitTest和pointInside的默认实现会使用最后一帧,这意味着你可以正常触摸平移或旋转的视图。

【讨论】:

  • 奇怪的是,框架通常是显式设置的,但也是一个计算属性。不过,这在hitTestpointInside 的上下文中是有道理的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多