所以我需要对视图应用一些缩放和一些旋转(我使用手势执行此操作),因此对于每个手势,我用以下内容更新当前的scalling和rotation值:
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);
当我只进行缩放时,它工作正常。当我进行缩放然后旋转时,它旋转正常。在旋转之后我尝试再次缩放,它不能正常工作:应用比例就像在旋转后完成一样,使我的图像结构变形。
我认为我做了需要做的事情以避免这种情况:每次从身份变换开始,先缩放然后旋转,但显然我错了......
有人知道我的实施有什么问题吗?
由于
答案 0 :(得分:10)
如果每次都以身份变换开始,则设置子视图变换的最终结果将仅包括当前手势的缩放和旋转。不是从身份开始,而是从视图的当前变换开始。
CGAffineTransform transform = self.theSubViewToTransform.transform;
transform = CGAffineTransformScale(transform, self.scaleWidth, self.scaleHeight);
transform = CGAffineTransformRotate(transform, self.rotationAngle);
self.theSubViewToTransform.transform = transform;
第一次执行时,变换将以身份变换开始。在随后的执行中,它将在旧的更改之上进行新的更改。
答案 1 :(得分:5)
swift 3 :
view.transform = CGAffineTransform(rotationAngle: CGFloat.pi).concatenating(CGAffineTransform(scaleX: 0.4, y: 0.4))
答案 2 :(得分:3)
您应该从当前转换状态开始并应用预期的转换。您还可以查看CGAffineTransformConcat
,它会在应用之前将其转换为单个转换。
CGAffineTransform transform = yourView.transform;
transform = CGAffineTransformConcat(CGAffineTransformScale(transform, self.scaleWidth, self.scaleHeight),
CGAffineTransformRotate(transform, self.rotationAngle));
yourView.transform = transform;
希望它有所帮助!
答案 3 :(得分:2)
尝试将转换应用于身份转换,例如
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, scaleWidth, scaleHeight);
transform = CGAffineTransformRotate(transform, angle);
viewToTransform.transform = transform;