我目前正在创建一组自定义视图以形成列表。但是,我遇到了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。
知道为什么会这样吗?
答案 0 :(得分:0)
大小在viewDidLoad
中没有意义,不应该在该方法中查询或设置。在 viewDidLoad
返回之后,才会计算视图布局。任何与布局相关的代码都应该采用viewDidLayoutSubviews
方法。