使用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))