【问题标题】:Zooming image after rotation旋转后缩放图像
【发布时间】:2012-04-09 00:45:37
【问题描述】:

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

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

图像旋转后,我无法放大和缩小。图像在屏幕上变得疯狂并回到未旋转状态。

我做错了什么?代码示例会很棒! 谢谢:)

【问题讨论】:

  • 你必须将缩放变换应用到之前的旋转变换
  • 两件家务:代替3.14,使用M_PI,在math.h中定义。这是最接近 pi 的浮点近似值。而且,Objective-C 命名约定以小写开头的方法和变量名称。所以,RotateImage(一个方法)应该是rotateImage,BaseImg(一个变量)应该是baseImg。

标签: objective-c ios uiscrollview uiimage rotation


【解决方案1】:

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 作为视图层的子层。将图像存储在子层中,并随意变换子层。这更快,并且允许任意旋转,但您需要计算自己的缩放比例以防止旋转图像超出视图边界。

【讨论】:

  • 如果此答案足够,请将其标记为已接受。这不仅增加了我的reputation - 它还帮助了该站点的其他访问者。这适用于您当前提出的所有 5 个问题。
【解决方案2】:

要简单地旋转图像,代码是完美的,但要添加放大和缩小,然后添加旋转,您需要保留其变换。这里是一个可以帮助您的示例代码。

https://github.com/elc/iCodeBlogDemoPhotoBoard

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多