如何在具有正确图像大小和滚动的UIScrollView内旋转UIImageView 90度?

时间:2011-02-16 14:20:04

标签: iphone ios uiscrollview uiimageview uiimage

我在UISmageView中有一个UIImageView内的图像。我想要做的是将此图像旋转90度,使其默认为横向,并设置图像的初始缩放,以便整个图像适合滚动视图,然后允许它缩放到100%并返回再次降至最小变焦。

这是我到目前为止所做的:

self.imageView.transform = CGAffineTransformMakeRotation(-M_PI/2);

float minimumScale = scrollView.frame.size.width  / self.imageView.frame.size.width;  
scrollView.minimumZoomScale = minimumScale;  
scrollView.zoomScale = minimumScale;  


scrollView.contentSize = CGSizeMake(self.imageView.frame.size.height,self.imageView.frame.size.width);

问题在于,如果我设置了转换,则滚动视图中不会显示任何内容。但是,如果我注释掉变换,除了图像不是我想要的横向方向外,一切都有效!

如果我应用转换并删除设置minimumZoomScale和zoomScale属性的代码,那么图像会以正确的方向显示,但是使用不正确的zoomScale并且似乎也没有正确设置contentSize属性 - 因为不会向左/右方向滚动到图像的边缘,但是在顶部和底部,但在边缘上方。

注意:正在从网址加载图片

5 个答案:

答案 0 :(得分:19)

也许旋转图像本身就符合您的需求:

 UIImage* rotateUIImage(const UIImage* src, float angleDegrees)  {   
    UIView* rotatedViewBox = [[UIView alloc] initWithFrame: CGRectMake(0, 0, src.size.width, src.size.height)];
    float angleRadians = angleDegrees * ((float)M_PI / 180.0f);
    CGAffineTransform t = CGAffineTransformMakeRotation(angleRadians);
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;
    [rotatedViewBox release];

    UIGraphicsBeginImageContext(rotatedSize);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
    CGContextRotateCTM(bitmap, angleRadians);

    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-src.size.width / 2, -src.size.height / 2, src.size.width, src.size.height), [src CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

答案 1 :(得分:3)

我认为最简单的方法(也是线程安全)是:

//assume that the image is loaded in landscape mode from disk
UIImage * LandscapeImage = [UIImage imageNamed: imgname];
UIImage * PortraitImage = [[UIImage alloc] initWithCGImage: LandscapeImage.CGImage
                                                     scale: 1.0
                                               orientation: UIImageOrientationLeft];

答案 2 :(得分:2)

基于imageView框架执行的任何计算都应该在对其应用任何变换之前完成。但我实际上建议根据UIImage的大小进行那些计算,而不是UIImageView。然后根据它设置UIImageView的框架和UIScrollView的contentSize。

马克斯的建议是一个很好的建议,虽然有了更大的图像,它可能是一个性能杀手。您是否在应用资源中显示此图片?如果是这样,为什么不在构建应用程序之前旋转图像呢?

答案 3 :(得分:2)

有一个更简单的解决方案也更快,只需这样做:

- (void) imageRotateTapped:(id)sender
{
    [UIView animateWithDuration:0.33f animations:^()
    {
        self.imageView.transform = CGAffineTransformMakeRotation(RADIANS(self.rotateDegrees += 90.0f));
        self.imageView.frame = self.imageView.superview.bounds; // change this to whatever rect you want
    }];
}

用户完成后,您需要实际创建一个新的旋转图像,但这很容易做到。

答案 4 :(得分:0)

我正在使用已接受的答案一段时间,直到我们注意到基于直接从相机拍摄的图像的非方形旋转似乎被拉伸(它们根据需要旋转,只是框架宽度/高度没有调整)。 / p>

很好的解释/来自Trevor的帖子:http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

最后,这是一个非常简单的Trevor代码导入,它使用类别向UIImage添加resizedImage:interpoationQuality方法。所以,是的,用户要小心,如果它仍然适合你,那很好。但如果没有,我会看一下图书馆。