4

我有一个定义为(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 示例中那样改变?

4

2 回答 2

7

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

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

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

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

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

于 2011-03-16T23:30:04.553 回答
1

UIView参考页具体说:

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

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

于 2011-03-16T21:20:23.820 回答