以更大和更小的尺寸居中和滚动 UIScrollView 内容

Centering and scrolling UIScrollView content with dimensions both larger and smaller

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

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

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

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

如果我的图片比滚动视图大一维,另一维小怎么办?

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

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

我真的很想有一种无论尺寸更大或更小都可以使用的方法。

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

从这里退一步,更好地理解 UIScrollView,并重新思考,我已经解决了我的问题。

对于初学者来说,layoutSubviews 是错误的方法,至少对于我需要的是这样。

尝试调整 UIScrollView 的大小并更新约束似乎麻烦多了。

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

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];

所有可能的图像尺寸(larger/smaller、one/both)都在滚动视图中居中,较大的图像尺寸可滚动,而较小的尺寸保持居中。

完美!