AutoLayout帧大小在功能之间变化

时间:2015-02-14 00:15:47

标签: ios objective-c cocoa-touch autolayout

我目前正在创建一组自定义视图以形成列表。但是,我遇到了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];
});

现在,当我检查scrollView大小时,它已从391更改为375.更奇怪的是,contentView已更改为0,0。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

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