【问题标题】:Behaviour of CGAffineTransformMakeScale with CGREct and with UIViewCGAffineTransformMakeScale 与 CGREct 和 UIView 的行为
【发布时间】:2011-03-16 21:09:06
【问题描述】:

我有一个框架定义为 (0,0,320,480) 的视图。
我把这个观点称为转型:

self.myView.transform = CGAffineTransformMakeScale(factor, factor); 

视图将缩放并保留屏幕上的中心位置,并且在我更改后他的框架将是例如 (34,-8,251,376),您可以看到 X 和 Y 现在不同于 0。

如果我在带有框架 (0,0,320,480) 的 CGRect 上使用相同的函数:

CGAffineTransform t = CGAffineTransformMakeScale(factor,factor);
CGRect rect2 = CGRectApplyAffineTransform(rect,t);

rect2 将为 X 和 Y 保留 0,我将获得类似 (0,0,251,376) 的结果

为什么 rect2 的 X 和 Y 不会像 UIView 示例中那样改变?

【问题讨论】:

    标签: objective-c ios cgaffinetransform


    【解决方案1】:

    确实,从技术上讲,您不应该在转换后查看 UIView 的 frame 属性,但从技术上讲,它也与您提出的问题无关。

    将 CAffineTransforms 应用于 UIView 时,转换会考虑 UIView 的支持 CALayer 的 anchorPoint 属性。来自anchorPoint 上的CALayer 文档:

    默认为 (0.5, 0.5),中心 边界矩形。

    这意味着当您应用缩放变换时,它会使用视图的中心作为锚点,因此视图会围绕该位置进行缩放。我猜如果你将锚点设置为 (0, 0),它的行为会像 CGRect 一样。

    另一方面,CGRect 是一个简单的 C 结构,没有支持层或锚点。因此行为上的差异。

    【讨论】:

      【解决方案2】:

      UIView reference page 明确表示:

      警告:如果转换属性是 不是身份转换,而是价值 此属性的未定义且 因此应该被忽略。

      所以不要在设置变换后查看视图的框架。

      【讨论】:

      • 谢谢,我认为区别就在这里:关于 UIVIew 上的变换参数:“指定应用于接收器的变换,相对于其边界的中心。”
      • 您可能是对的,但很明显,在您设置 myView.transform 后,myView.frame 仍然未定义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2011-03-23
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多