以编程方式添加视图时动态放大UIScrollview的内容大小

时间:2015-12-17 10:34:37

标签: ios objective-c uiscrollview autolayout nslayoutconstraint

我有以下情况:

  • UIScrollView(" _scrollView")有一个孩子:UIView
  • UIView(" _layoutContainer")拥有未知数量的childViews
  • 以编程方式添加UIView的childViews,并以编程方式设置它们的约束。

添加子视图的代码(我尝试调整scrollview的内容大小):

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView* lastLabel = _topCollectionView;
    for (int i = 0; i<50; i++) {
        UILabel* imageLabelView = [UILabel new];
        imageLabelView.translatesAutoresizingMaskIntoConstraints = NO;

        [_layoutContainer addSubview:imageLabelView];

        [_layoutContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[labelview]-(10)-|" options:0 metrics:nil views:@{@"labelview":imageLabelView}]];
        [_layoutContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[previousLabel]-(10)-[imagelabel(40)]" options:0 metrics:nil views:@{@"previousLabel":lastLabel, @"imagelabel":imageLabelView}]];

        imageLabelView.text = @"DUMMY";
        lastLabel = imageLabelView;
    }

    [_layoutContainer setNeedsLayout];
    [_layoutContainer layoutIfNeeded];
    _scrollView.contentSize = _layoutContainer.frame.size;
    [_scrollView invalidateIntrinsicContentSize];
}

My Storyboard Constraints看起来像这样:

Constraints in Storyboard

此代码在日志中没有任何约束错误,并且看起来像预期。

我的问题是: scrollview的内容大小不会改变。我可以添加尽可能多的标签,但滚动永远不会有效。 你能帮我动态扩大我的滚动视图吗?

1 个答案:

答案 0 :(得分:1)

如果所有约束都足以在容器视图中定义内部内容大小,则滚动视图-contentSize应相应调整大小,只需在添加后调用滚动视图上的-(void)invalidateIntrinsicContentSize内容。

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView* lastLabel = _topCollectionView;
    for (int i = 0; i<50; i++) {
        UILabel* imageLabelView = [UILabel new];
        imageLabelView.translatesAutoresizingMaskIntoConstraints = NO;

        [_layoutContainer addSubview:imageLabelView];

        [_layoutContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[labelview]-(10)-|" options:0 metrics:nil views:@{@"labelview":imageLabelView}]];
        [_layoutContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[previousLabel]-(10)-[imagelabel(40)]" options:0 metrics:nil views:@{@"previousLabel":lastLabel, @"imagelabel":imageLabelView}]];

        imageLabelView.text = @"DUMMY";
        lastLabel = imageLabelView;
    }

    [_layoutContainer setNeedsLayout];
    [_layoutContainer layoutIfNeeded];
    [_scrollView invalidateIntrinsicContentSize];
    [_scrollView setNeedsLayout];
    [_scrollView layoutIfNeeded];
}