iphone - 将可缩放图像保持在 UIScrollView 的中心

标签 iphone ios uiscrollview zooming

在我的 iPhone 应用程序中,我需要为用户提供在屏幕上缩放/平移大图像的功能。这非常简单:我使用 UIScrollView,设置最大/最小比例因子并按预期进行缩放/平移。这就是事情变得有趣的地方。该图像是从服务器接收的动态图像。它可以有任何维度。当图像首次加载时,它会按比例缩小(如果需要)以完全适合 UIScrollView 并在 ScrollView 中居中 - 屏幕截图如下:

enter image description here

由于图像的比例与 ScrollView 的比例不同,因此在图像上方和下方添加了空白,以使图像居中。然而,当我开始缩放图像时,实际图像变得足够大以填充整个 ScrollView 视口(viewport),因此不再需要顶部/底部的白色填充,但是它们仍然存在,从这个截图中可以看出:

enter image description here

我相信这是因为包含图像的 UIImageView 会自动调整大小以填充整个 UIScrollView 并且在缩放时,它只会按比例增长。它的缩放模式设置为 Aspect FitUIScrollView 的委托(delegate) viewForZoomingInScrollView 只是返回 ImageView 。

我试图在 scrollViewDidEndZooming 方法中重新计算并重新设置 UIScrollViewcontentSize 和 ImageView 的大小:

CGSize imgViewSize = imageView.frame.size;
CGSize imageSize = imageView.image.size;

CGSize realImgSize;
if(imageSize.width / imageSize.height > imgViewSize.width / imgViewSize.height) {
    realImgSize = CGSizeMake(imgViewSize.width, imgViewSize.width / imageSize.width * imageSize.height);
}
else {
    realImgSize = CGSizeMake(imgViewSize.height / imageSize.height * imageSize.width, imgViewSize.height);
}
scrollView.contentSize = realImgSize;

CGRect fr = CGRectMake(0, 0, 0, 0);
fr.size = realImgSize;
imageView.frame = fr;

然而,这只会让事情变得更糟(边界仍然存在,但平移在垂直方向上不起作用)。

有没有什么方法可以在不需要时自动减少空白,然后在放大过程中再次增加?我怀疑这项工作需要在 scrollViewDidEndZooming 中完成,但我不太确定该代码需要是什么。

最佳答案

太棒了!

感谢代码:)

只是想我会添加到这里,因为我稍微改变了它以改善行为。

// make the change during scrollViewDidScroll instead of didEndScrolling...
-(void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    CGSize imgViewSize = self.imageView.frame.size;
    CGSize imageSize = self.imageView.image.size;

    CGSize realImgSize;
    if(imageSize.width / imageSize.height > imgViewSize.width / imgViewSize.height) {
        realImgSize = CGSizeMake(imgViewSize.width, imgViewSize.width / imageSize.width * imageSize.height);
    }
    else {
        realImgSize = CGSizeMake(imgViewSize.height / imageSize.height * imageSize.width, imgViewSize.height);
    }

    CGRect fr = CGRectMake(0, 0, 0, 0);
    fr.size = realImgSize;
    self.imageView.frame = fr;

    CGSize scrSize = scrollView.frame.size;
    float offx = (scrSize.width > realImgSize.width ? (scrSize.width - realImgSize.width) / 2 : 0);
    float offy = (scrSize.height > realImgSize.height ? (scrSize.height - realImgSize.height) / 2 : 0);

    // don't animate the change.
    scrollView.contentInset = UIEdgeInsetsMake(offy, offx, offy, offx);
}

关于iphone - 将可缩放图像保持在 UIScrollView 的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14069571/

相关文章:

ios - 使 UIScrollView 仅在内容部分起作用,而不是 "sides"

iphone - _dyld_start 导致 iPhone 应用程序泄漏

ios - 如何在 iOS 上拍摄全屏相机照片?

iphone - 为 iPhone Flash 应用程序优化 tweenlite

ios - 设备纵向时获取 UINavigationBar 横向高度

ios - 如何检查哪个collectionview是否在快速滚动

ios - Apple 是否为没有 Mac 设备的程序员提供开发 iOS 安装程序?

ios - 如何观察RestKit中是否有字段。值为null时不调用Setter

ios - xCode 不会从 Unity 解析项目

ios - UITextView vs UILabel 高度计算