以更大和更小的尺寸居中和滚动 UIScrollView 内容
Centering and scrolling UIScrollView content with dimensions both larger and smaller
当 UIScrollView 的尺寸既大于又小于包含的滚动视图时,您如何处理居中和滚动内容?
我一直在尝试在 layoutSubviews 中设置值来处理内容的初始居中,同时仍然允许滚动。
如果内容在两个维度上都较小,我可以设置 frame 并且图像在所有旋转和方向上都正确居中。设置 contentInset 也可以。 contentOffset 似乎不起作用。
如果两个维度的内容都比较大,我可以设置contentOffset初始显示,不再修改支持滚动
如果我的图片比滚动视图大一维,另一维小怎么办?
contentOffset 使用 CGPoint,contentInset 使用 UIEdgeInsets(上、左、下、右)。我试过混合正面和负面,因为一个维度需要移入另一个维度,但没有任何效果。
我的下一个想法是调整滚动视图的大小(并修改我想的约束)以便内容永远不会小于容器并使用 contentOffset.
我真的很想有一种无论尺寸更大或更小都可以使用的方法。
这个问题的最佳解决方案(a solution)是什么?
从这里退一步,更好地理解 UIScrollView,并重新思考,我已经解决了我的问题。
对于初学者来说,layoutSubviews 是错误的方法,至少对于我需要的是这样。
尝试调整 UIScrollView 的大小并更新约束似乎麻烦多了。
无论出于何种原因,我最初并没有想到我可以同时使用 contentOffset 和 contentInset(出于某种原因认为它是 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)都在滚动视图中居中,较大的图像尺寸可滚动,而较小的尺寸保持居中。
完美!
当 UIScrollView 的尺寸既大于又小于包含的滚动视图时,您如何处理居中和滚动内容?
我一直在尝试在 layoutSubviews 中设置值来处理内容的初始居中,同时仍然允许滚动。
如果内容在两个维度上都较小,我可以设置 frame 并且图像在所有旋转和方向上都正确居中。设置 contentInset 也可以。 contentOffset 似乎不起作用。
如果两个维度的内容都比较大,我可以设置contentOffset初始显示,不再修改支持滚动
如果我的图片比滚动视图大一维,另一维小怎么办?
contentOffset 使用 CGPoint,contentInset 使用 UIEdgeInsets(上、左、下、右)。我试过混合正面和负面,因为一个维度需要移入另一个维度,但没有任何效果。
我的下一个想法是调整滚动视图的大小(并修改我想的约束)以便内容永远不会小于容器并使用 contentOffset.
我真的很想有一种无论尺寸更大或更小都可以使用的方法。
这个问题的最佳解决方案(a solution)是什么?
从这里退一步,更好地理解 UIScrollView,并重新思考,我已经解决了我的问题。
对于初学者来说,layoutSubviews 是错误的方法,至少对于我需要的是这样。
尝试调整 UIScrollView 的大小并更新约束似乎麻烦多了。
无论出于何种原因,我最初并没有想到我可以同时使用 contentOffset 和 contentInset(出于某种原因认为它是 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)都在滚动视图中居中,较大的图像尺寸可滚动,而较小的尺寸保持居中。
完美!