居中和滚动 UIScrollView 内容,尺寸更大或更小

Posted

技术标签:

【中文标题】居中和滚动 UIScrollView 内容,尺寸更大或更小【英文标题】:Centering and scrolling UIScrollView content with dimensions both larger and smaller 【发布时间】:2016-03-24 23:20:48 【问题描述】:

当尺寸都大于和小于包含滚动视图时,如何处理 UIScrollView 中的居中和滚动内容?

我一直在尝试在 layoutSubviews 中设置值来处理内容的初始居中,同时仍然允许滚动。

如果内容在两个维度上都较小,我可以设置 frame 并且图像在所有旋转和方向上都正确居中。设置 contentInset 也可以。 contentOffset 似乎不起作用。

如果两个维度的内容都比较大,我可以设置contentOffset为初始显示,不再修改支持滚动。

如果我的图像的一个维度大于滚动视图,而另一个维度小于滚动视图,我该怎么办?

contentOffset 使用 CGPointcontentInset 使用 UIEdgeInsets(上、左、下、右)。我尝试混合正面和负面,因为一个维度需要移入另一个维度,但没有任何工作。

我的下一个想法是调整滚动视图的大小(并修改我想的约束),以便内容永远不会小于容器并使用 contentOffset

我真的很想有一个单一的方法,无论尺寸大小都可以使用。

什么是这个问题的最佳解决方案(解决方案)?

【问题讨论】:

【参考方案1】:

退后一步,对UIScrollView有了更深入的了解,重新思考,我的问题已经解决了。

对于初学者来说,layoutSubviews 是错误的方式,至少对于我所需要的而言。

尝试调整 UIScrollView 的大小并更新约束似乎比它的价值更麻烦。

无论出于何种原因,我最初并没有想到我可以同时使用 contentOffsetcontentInset (认为它是/或对于某些人原因),但这是我的确切解决方案。

CGRect rectContent = CGRectMake(0, 0, image.size.width, image.size.height);

UIImageView *imageView = [[UIImageView alloc] initWithFrame:rectContent];
self.scrollView.contentSize = rectContent.size;

CGFloat fOffsetWidth = (rectContent.size.width < self.scrollView.bounds.size.width) ? (self.scrollView.bounds.size.width - rectContent.size.width)/2 : 0;
CGFloat fOffsetHeight = (rectContent.size.height < self.scrollView.bounds.size.height) ? (self.scrollView.bounds.size.height - rectContent.size.height)/2 : 0;

self.scrollView.contentInset = UIEdgeInsetsMake(fOffsetHeight, fOffsetWidth, fOffsetHeight, fOffsetWidth);
self.scrollView.contentOffset = CGPointMake((rectContent.size.width - self.scrollView.bounds.size.width)/2, (rectContent.size.height - self.scrollView.bounds.size.height)/2);

imageView.image = image;

[self.scrollView addSubview:imageView];

所有可能的图像尺寸(更大/更小,一个/两个)在滚动视图中居中,较大的图像尺寸是可滚动的,而较小的尺寸保持居中。

完美!

【讨论】:

以上是关于居中和滚动 UIScrollView 内容,尺寸更大或更小的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 不会随着里面的内容视图滚动

在 UIScrollView 中更改内容的居中

iOS UIScrollView捏缩放添加空白

UIScrollView 增加并居中内容

如何在故事板中设计 UIScrollView

UIScrollView详解