Objective c 使用CGREct和UIView的CGAffineTransformMakeScale行为

Objective c 使用CGREct和UIView的CGAffineTransformMakeScale行为,objective-c,ios,cgaffinetransform,Objective C,Ios,Cgaffinetransform,我有一个框架定义为(0,0320480)的视图。 我把这种观点称为转变: self.myView.transform = CGAffineTransformMakeScale(factor, factor); 视图将按比例缩放,保留屏幕上的中心位置,并且在我的更改后,他的帧将是例如(34,-8251376),正如您可以看到的,X和Y现在不同于0 如果我在具有帧(0,0320480)的CGRect上使用相同的函数: rect2将为X和Y保留0,我将得到类似(0,0251376)的结果 为什么r

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

self.myView.transform = CGAffineTransformMakeScale(factor, factor); 
视图将按比例缩放,保留屏幕上的中心位置,并且在我的更改后,他的帧将是例如(34,-8251376),正如您可以看到的,X和Y现在不同于0

如果我在具有帧(0,0320480)的CGRect上使用相同的函数:

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

为什么rect2的X和Y没有像UIView示例中那样改变

报告明确指出:

警告:如果转换属性为 不是身份转换,而是值 此属性的值未定义且 因此,我们应该忽略这一点


因此,在设置视图的转换后,不要查看它的帧。

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

将CAffineTransforms应用于UIView时,转换将考虑UIView的backing CALayer的anchorPoint属性。从anchorPoint上的文档:

默认设置为(0.5,0.5),即 边界为矩形

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


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

谢谢,我认为区别在于:UIVIew上的About transform参数:“指定应用于接收器的相对于其边界中心的变换。”您可能是对的,但是很明显,在设置
myView.transform
之后,
myView.frame
仍然是未定义的。
CGAffineTransform t = CGAffineTransformMakeScale(factor,factor);
CGRect rect2 = CGRectApplyAffineTransform(rect,t);