缩小放置在 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:
。当然,您必须为minimumZoomScale
和maximumZoomScale
设置正确的属性值。
有关以下链接的更多信息:
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的主要内容,如果未能解决你的问题,请参考以下文章
将 UINavigationBar 附加到 UIScrollView 以获得缩小的标题