缩小放置在 UIScrollView 中的 UIImageView

Posted

技术标签:

【中文标题】缩小放置在 UIScrollView 中的 UIImageView【英文标题】:Scaling down UIImageView placed in a UIScrollView 【发布时间】:2014-02-24 13:41:40 【问题描述】:

在 Xcode 5 中,我创建了 a universal app,其中 UIScrollView 包含 UIImageView(此处为 fullscreen):

由于我在 Interface Builder 中设置了所有 UI 属性(要显示的图像,UIImageView 尺寸为 1000 x 1000 像素,UIImageView 模式设置为“缩放填充”),实际来源ViewController.m 中的代码很短:

- (void)viewDidLayoutSubviews

    [super viewDidLayoutSubviews];

    /*
    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) 
        _imageView.frame = CGRectMake(_imageView.frame.origin.x,
                                      _imageView.frame.origin.y,
                                      800, 800);
    
    */

    _scrollView.contentSize = _imageView.bounds.size;

    NSLog(@"%s: _scrollView %@ %@",
          __PRETTY_FUNCTION__,
          NSStringFromCGPoint(_scrollView.frame.origin),
          NSStringFromCGSize(_scrollView.frame.size));

    NSLog(@"%s: _imageView %@ %@",
          __PRETTY_FUNCTION__,
          NSStringFromCGPoint(_imageView.frame.origin),
          NSStringFromCGSize(_imageView.frame.size));

这在 iPhone 和 iPad 上的效果出人意料(对于 ios 新手来说),应用程序甚至可以旋转。

但是为 iPhone 显示的图像有点太大,需要按比例缩小才能更舒适地播放:

我希望,因为 UIImageView 模式是“缩放填充”,我只需要更改它的 frame(或 bounds?我都尝试过) - 如显示的注释代码所示以上。

但这不起作用 - 滚动中断(不能再滚动到图像底部)。

有什么建议吗?

(我还希望稍后添加捏合和双击手势识别器 - 并在其中缩放UIImageView)。

更新:

我已尝试按照 Andrei 的建议(谢谢!)将以下代码添加到 viewDidLayoutSubviews,但图像并没有缩小:

if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) 
    _scrollView.maximumZoomScale = 1.2;
    _scrollView.minimumZoomScale = .8;
    _scrollView.zoomScale = .8;

【问题讨论】:

【参考方案1】:

UIScrollView 可以为您处理缩放以及捏合手势。

您只需要在“minimumZoomScale”和“maximumZoomScale”属性中设置适当的值,它就会让用户在这些限制之间进行调整。 您还需要实现

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView

来自 UIScrollViewDelegate 的方法。它应该只返回 imageView。

您还可以使用“zoomScale”属性设置缩放级别。

对于双击,您需要将自己的双击手势识别器添加到滚动视图,并在双击发生时增加缩放级别。

更新带有委托方法和双击手势。

【讨论】:

+1 谢谢,但是当我设置_scrollView.zoomScale=.8 时,图像没有按比例缩小(请参阅更新后的问题)。 是的,我的错,正如 Legoless 所说,您还需要从 UIScrollViewDelegate 实现 - (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView 方法。它应该只返回 imageView。我也更新了我的答案。【参考方案2】:

您一定要了解AutoLayout。如果 AutoLayout 已打开,您将无法更改框架和边界。您当然可以为整个 Storyboard 关闭它。

您的问题的解决方案是约束。 您可以使用它们定义视图之间的关联方式,例如:UIScrollView 与其父视图的关联方式以及 UIImageView 与其父视图的关联方式你的UIScrollView

详细了解以下链接的约束:

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/Introduction/Introduction.html http://www.raywenderlich.com/50317/beginning-auto-layout-tutorial-in-ios-7-part-1

虽然UIScrollView 可以为您处理捏合缩放,但您必须实现正确的委托方法:viewForZoomingInScrollView:。当然,您必须为minimumZoomScalemaximumZoomScale 设置正确的属性值。

有关以下链接的更多信息:

https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/UIScrollView_pg/ZoomZoom/ZoomZoom.html http://www.raywenderlich.com/10518/how-to-use-uiscrollview-to-scroll-and-zoom-content

这两个网站都有足够的信息和示例供您执行此操作。首先试验这些网站上提供的代码,然后在遇到问题时发布另一个更具体的问题。

【讨论】:

以上是关于缩小放置在 UIScrollView 中的 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView保存/恢复设置

将 UINavigationBar 附加到 UIScrollView 以获得缩小的标题

如何使用 swift 填充我放置在 UITableCell 中的整个 UIScrollView

缩小 UIScrollView

放大时只允许 UIScrollView 缩放弹跳,不能缩小

如何在 UIScrollview iOS 中将图像缩小 30%?