2012-04-09 165 views
2

我有一个图像里面的UIScrollView,我可以放大和缩小。 我有一个按钮,让用户将图像旋转90度:旋转后缩放图像

(void)RotateImage { 
    CGAffineTransform rotateTrans = CGAffineTransformMakeRotation(-90.0/180.0 * 3.14); 
    BaseImg.transform = rotateTrans; 
} 

成像的旋转,我不能放大和缩小后..图像会在屏幕上疯狂,要回未旋转状态。

我在做什么错了?代码示例将非常棒! 谢谢:)

+0

你必须运用尺度变换到以前的旋转变换 – Otium 2012-04-09 01:23:16

+0

两件看家的:不是3.14'的',用'M_PI',在math.h中定义这是最接近pi的浮点数。并且,Objective-C命名约定以小写启动方法和变量名称。所以,RotateImage(一种方法)应该是rotateImage,而BaseImg(一个变量)应该是baseImg。 – Dondragmer 2012-04-09 01:50:11

+0

记住这一点..谢谢 – user1044303 2012-04-09 17:07:28

回答

0

UIScrollView喜欢接管它包含的视图的转换。有两种解决方案:

  1. 旋转图像而不更改包含视图。
  2. 创建一个在子图层中显示图像的UIView子类。

旋转图像,请参阅How to Rotate a UIImage 90 degrees?。如果您始终只做90度旋转,请参阅@Peter Sarnowski's solution。以使其适应你在做什么这里,假设BaseImgUIImageView

- (void) rotateImage 
{ 
    UIImage *sourceImage = [baseImg image]; 
    UIImage *rotatedImage = [UIImage imageWithCGImage:[sourceImage CGImage] scale:1.0 orientation:UIImageOrientationRight]; 
    [baseImg setImage:rotatedImage]; 
} 

这只会轮换一次。要使rotateImage重复工作,请阅读现有的orientation属性并按顺时针或逆时针顺序将其移动到下一个属性。

如果图像不是方形,您可能还需要调整baseImg以反映其新的宽高比。

创建一个UIView子类,你需要让它存储一个CALayer作为视图层的子层。将图像存储在子图层中,并随意转换子图层。这是更快,并允许任意旋转,但你需要计算自己的缩放,以防止旋转图像超出视图范围。

+0

谢谢!帮助我很多 – user1044303 2012-04-09 17:07:01

+0

如果这个答案足够了,请将其标记为已接受。这不仅仅会增加我的[声誉](http://stackoverflow.com/faq#reputation) - 它可以帮助本网站的其他访问者。这适用于您当前要求的所有5个问题。 – Dondragmer 2012-04-09 22:31:13