我目前正在创建一组自定义视图来形成一个列表。但是,我对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
方法中。