使用CGREct和UIView进行CGAffineTransformMakeScale的行为

Mat*_*oal 4 objective-c cgaffinetransform ios

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

self.myView.transform = CGAffineTransformMakeScale(factor, factor); 
Run Code Online (Sandbox Code Playgroud)

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

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

CGAffineTransform t = CGAffineTransformMakeScale(factor,factor);
CGRect rect2 = CGRectApplyAffineTransform(rect,t);
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*ing 7

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

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

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

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

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