繁体   English   中英

AutoLayout框架大小在功能之间变化

[英]AutoLayout frame size changing between functions

我目前正在创建一组自定义视图以形成列表。 但是,我在使用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。

知道为什么会这样吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM