在函数之间更改自动布局框架大小



我目前正在创建一组自定义视图来形成一个列表。但是,我对AutoLayout有一个问题。

视图的大小似乎在函数调用之间发生变化。以下是一些代码:

- (void)viewDidLoad
{
    [self.scrollView layoutIfNeeded];
    self.contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.scrollView.frame.size.width, 50.0f)];
    [self.contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.scrollView addSubview:self.contentView];
    [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:0 views:@{@"contentView":self.contentView}]];
    [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:@{@"contentView":self.contentView}]];

第一个layoutIfNeeded是因为大小返回了600的宽度(Interface Builder中的默认值),而这似乎会影响其余的大小调整。

然而,我的主要问题是,在viewDidLoad期间,scrollView和contentView的大小返回正确。然后,如果我从viewDidLoad中调用以下函数:

- (void)renderStreams
{
    NSLog(@"Scroll View: %@", NSStringFromCGSize(self.scrollView.frame.size));
    NSLog(@"Content View: %@", NSStringFromCGSize(self.contentView.frame.size));

它运行良好,大小返回正确。但是,我的代码会调用另一个类,该类异步加载我的数据并触发通知。在我当前的类中,我调用renderStreams函数如下:

dispatch_sync(dispatch_get_main_queue(), ^(void)
{
     [self renderStreams];
});

现在,当我检查滚动视图的大小时,它已经从391变为375。更奇怪的是,contentView已更改为0,0。

知道为什么会发生这种事吗?

大小在viewDidLoad中没有意义,不应在该方法中查询或设置。直到viewDidLoad返回后,才会计算视图布局。任何与布局相关的代码都应该在viewDidLayoutSubviews方法中。

最新更新