[英]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.