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

时间:2016-03-24 23:20:48

标签: ios uiscrollview

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

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

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

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

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

contentOffset 使用 CGPoint contentInset 使用 UIEdgeInsets (顶部,左侧,底部,右侧)。我尝试过混合正面和负面,因为一个维度需要被移入而另一个需要移动,但是没有任何工作。

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

我真的希望有一种方法可以在更大或更小的尺寸下工作。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

完美!