我有一个 UIScrollView 包含几个动态调整大小的子视图。我可以很好地调整子视图的大小和布局,但是当我设置滚动视图本身的内容大小时,底部的子视图会被剪裁。为什么滚动视图的内容大小高度应该大于它包含的视图高度的总和是否有某种原因?
这是我更详细的情况:我有一个包含 UIScrollView 的超级视图,其中包含多个子视图。在超级视图的 layoutSubviews 方法中,我计算了每个子视图所需的大小,然后设置框架,使子视图垂直平铺在屏幕下方,并在它们之间留出一点空间。完成后,我将 UIScrollView 的内容大小的高度设置为最后一个子视图的结尾(origin.y + size.height)。理论上,这意味着滚动视图的内容区域的底部应该与最后一个子视图的底部完全对齐。
但事实并非如此。相反,最后一个子视图的一大块被剪裁了。它仍然存在 - 如果我向下滚动,我可以在“反弹”期间看到剩余部分。在横向模式下问题更严重 - 底部子视图的大部分根本不可见。
子视图都被正确排列和定位。问题是 UIScrollView 的 contentSize 似乎需要明显大于子视图的高度总和(加上它们之间的空间)。这对我来说没有任何意义。此外,大小“关闭”的数量会有所不同 - 我多次使用不同的子视图重复使用此视图,并且它们都关闭了不同的数量。因此,简单地向内容视图高度添加一个常量是没有帮助的。
是什么导致内容大小(或我的高度计算)无法正常运行?
代码:
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat width = self.bounds.size.width - [self subviewLeftMargin] - [self subviewRightMargin]; // All subviews have same width as parent view
CGFloat x = [self subviewLeftMargin]; // All subviews should start at the far left of the view
CGFloat y = [self spaceBetweenSubviews]; // Running tally of the y coordinate for the next view
/* Adjust the subviews */
for(UIView *view in self.theVariousSubviews) {
/* Resize the view with the desired width, then let it size its height as needed */
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, width, view.frame.size.height);
CGSize newSize = [view sizeThatFits:view.frame.size];
/* Set the origin */
//The subviews are positioned correctly, so this doesn't seem to be a problem
view.frame = CGRectMake(x, y, newSize.width, newSize.height);
/* Have the view refresh its own layout */
[view setNeedsLayout];
/* Update the y value for the next subview */
y += newSize.height + [self spaceBetweenSubviews];
}
/* Resize the scroll view to ensure it fits all of the content */
CGFloat scrollViewHeight = y;
self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, scrollViewHeight);
//Content size is set to the same total height of all subviews and spacing, yet it is too small. Why?
}