2016-08-15 45 views
0

我使用下面的代码到一个覆盖视图添加到视图:添加子视图的UITableView与自动布局不设置它的框架

UIView *overlayView = [[UIView alloc] init]; 
overlayView.backgroundColor = [UIColor redColor]; 

[self.view addSubview:overlayView]; 

overlayView.translatesAutoresizingMaskIntoConstraints = NO; 
NSDictionary *views = NSDictionaryOfVariableBindings(overlayView); 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[overlayView]|" options:0 metrics:nil views:views]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[overlayView]|" options:0 metrics:nil views:views]]; 

如果我在UIViewControllerviewDidLoad方法将此代码放在它工作正常。但是,如果我在UITableViewController中执行相同操作,则覆盖视图将获得零帧。

我检查了视图,我可以将约束添加正确,并且它们是活动的。但出于某种原因,他们似乎被忽略了。

我没有收到任何错误或警告。

我在这里错过了什么?

PS:我知道我可以用self.view.bounds作为框架实例化叠加视图,并且它可以工作。不过,我需要使用自动布局。

回答

0

怀疑这是因为UITableView是一个UIScrollView,当处理建立自己的边界系统的视图(如滚动视图或表视图)时,自动布局有一些注意事项。

在叠加视图上设置的约束是这样的,它限制为滚动视图的顶部,右侧,底部和左侧边缘,从而限制为滚动视图的内容区域而不是滚动视图的框架。

https://developer.apple.com/library/ios/technotes/tn2154/_index.htmlAuto Layout Guide: Working with Scroll Views:滚动视图的边缘或利润,其 内容之间

约束附加到滚动视图的内容区域。

而不是将覆盖视图限制在内容区域,而是将其限制为滚动视图的框架。根据上面的参考文献,这可以通过将覆盖视图的宽度/高度限制为滚动视图来完成,或者通过将覆盖视图限制在滚动视图之外的视图来完成。

+0

是的,我想这是这样的。我确实以其他方式解决了这个问题,但是我更希望能够使用自动布局。 – pajevic

+0

在iOS 11中,您可以使用表视图的frameLayoutGuide属性。 –

相关问题