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

时间:2011-11-09 11:06:08

标签: objective-c ios cgaffinetransform

所以我需要对视图应用一些缩放和一些旋转(我使用手势执行此操作),因此对于每个手势,我用以下内容更新当前的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);

当我只进行缩放时,它工作正常。当我进行缩放然后旋转时,它旋转正常。在旋转之后我尝试再次缩放,它不能正常工作:应用比例就像在旋转后完成一样,使我的图像结构变形。

我认为我做了需要做的事情以避免这种情况:每次从身份变换开始,先缩放然后旋转,但显然我错了......

有人知道我的实施有什么问题吗?

由于

4 个答案:

答案 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;