contentView比UIScrollView短

时间:2017-01-27 20:50:26

标签: objective-c uiscrollview

我可以使用下面的代码一直向下滚动:

- (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(灰色)很短,下面的所有内容都不起作用: enter image description here

修改 enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

编辑布局可能有两个问题。 (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大小调整为<​​/ strong>并计算其他子视图的最大范围:

我们通常的目标是使contentSize.height大到足以包含最底部子视图的底边。

这与OP视图中的子视图高度之和的计算方法不同。 (考虑偏移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))];
    });
}

异步调用是无害的,但希望是不必要的。循环运行的时间很短,或者我们添加了太多的子视图。

答案 1 :(得分:0)

尝试这个

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

    });
}