我可以在下面的代码中向下滚动:
- (void)viewDidLayoutSubviews {
dispatch_async (dispatch_get_main_queue(), ^ {
CGFloat scrollViewHeight = 0.0f;
for (UIView* view in self.scrollView.subviews) {
scrollViewHeight += view.frame.size.height;
}
[self.scrollView setContentSize:(CGSizeMake(320, scrollViewHeight))];
});
}但是,当我滚动时,contentView (灰色)是短的,它下面的所有东西都不能工作:

编辑:


发布于 2017-01-27 21:11:44
编辑--布局可能有两种错误。(1)滚动视图(灰色)的单个子视图需要足够大以包含它的子视图,(2)正如OP所暗示的那样,scrollView contentSize也必须如此。
UIView *grayView = // get a pointer to that grayView
CGFloat maxContentY = 0.0;
for (UIView* view in grayView.subviews) {
maxContentY = MAX(maxContentY, CGRectGetMaxY(view.frame));
}
grayView.frame = CGRectMake(0,0, 320,maxContentY);如果这是scrollView的唯一子视图,那么contentSize很简单:
[self.scrollView setContentSize:grayView.frame.size];如果除了灰色视图之外,还有其他子视图,那么我最初的回答是也是,grayView的大小为,则表示其他子视图的最大范围:
我们通常的目标是使contentSize.height足够大,包括最底层的子视图的底部边缘。
这与运算式中的子视图高度之和不同。(考虑偏置y == 1000和高度== 2的单个子视图,我们希望高度为1002,而不是2),所以.
- (void)viewDidLayoutSubviews {
dispatch_async (dispatch_get_main_queue(), ^ {
CGFloat maxY = 0.0f;
for (UIView* view in self.scrollView.subviews) {
maxY = MAX(maxY, CGRectGetMaxY(view.frame));
}
[self.scrollView setContentSize:(CGSizeMake(320, maxY))];
});
}异步调用是无害的,但希望是不必要的。要么循环在琐碎的时间内运行,要么我们添加了太多的子视图。
发布于 2017-01-28 07:31:00
试试这个
- (void)viewDidLayoutSubviews {
dispatch_async (dispatch_get_main_queue(), ^ {
CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews)
contentRect = CGRectUnion(contentRect, view.frame);
[self.scrollView setContentSize:contentRect.size];
});
}https://stackoverflow.com/questions/41902811
复制相似问题