使用CGAffineTransform在视图上应用缩放和旋转

所以我需要应用一些缩放和一些旋转到一个视图(我使用手势做这个),所以对于每个手势,我更新当前的缩放和旋转值,如下所示:

self.scaleWidth *= gesture.scale; //When I detect an horizontal pinch self.scaleHeight *= gesture.scale; //When I detect a vertical pinch self.rotationAngle += gesture.rotationAngle; //When I detect a rotation 

然后我做了以下转换的观点:

 CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, self.scaleWidth, self.scaleHeight); self.theSubViewToTransform.transform = CGAffineTransformRotate(transform, self.rotationAngle); 

当我只做缩放,它工作正常。 当我做缩放,然后旋转,它转动很好。 当旋转后,我尝试再次缩放,它不能正常工作:缩放应用,如同在旋转后完成,使图像结构变形。

我想我做了什么需要做的,以避免这种情况:每次从身份转换开始,先缩放然后旋转,但显然我错了…

有没有人知道我的实现有什么问题?

谢谢

如果每次都从身份转换开始,那么将子视图的转换设置为仅包含当前手势的缩放和旋转。 从视图的当前转换开始,而不是从身份开始。

 CGAffineTransform transform = self.theSubViewToTransform.transform; transform = CGAffineTransformScale(transform, self.scaleWidth, self.scaleHeight); transform = CGAffineTransformRotate(transform, self.rotationAngle); self.theSubViewToTransform.transform = transform; 

第一次执行时,变换将作为身份变换开始。 在随后的执行过程中,它会使新的变化高于旧的变化。

您应该从当前的转换状态开始,并应用预期的转换。 你也可以看看CGAffineTransformConcat ,它会在应用之前做一个单一的转换。

 CGAffineTransform transform = yourView.transform; transform = CGAffineTransformConcat(CGAffineTransformScale(transform, self.scaleWidth, self.scaleHeight), CGAffineTransformRotate(transform, self.rotationAngle)); yourView.transform = transform; 

希望能帮助到你!

尝试将转换应用于身份转换,例如

 CGAffineTransform transform = CGAffineTransformIdentity; transform = CGAffineTransformScale(transform, scaleWidth, scaleHeight); transform = CGAffineTransformRotate(transform, angle); viewToTransform.transform = transform; 

对于迅捷3

 view.transform = CGAffineTransform(rotationAngle: CGFloat.pi).concatenating(CGAffineTransform(scaleX: 0.4, y: 0.4))