使用CGREct和UIView进行CGAffineTransformMakeScale的行为

我有一个视图,框架定义为(0,0,320,480)。
我在这个观点上调用转换:

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

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

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

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

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

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

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

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

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

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

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

UIView参考页面具体说明:

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

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