使用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变换,则此属性的值未定义,因此应忽略。
所以在设置变换后不要查看视图的帧。