使用autolayout将子视图添加到UITableView并不会设置其帧

时间:2016-08-15 13:33:00

标签: uitableview uiview uiviewcontroller autolayout

我使用以下代码向视图添加叠加视图:

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]];

如果我将此代码放在viewDidLoad的{​​{1}}方法中,则可以正常使用。但是,如果我在UIViewController中执行相同操作,则叠加视图将获得零帧。

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

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

我在这里缺少什么?

PS:我知道我可以用UITableViewController作为帧来实例化叠加视图,并且它可以工作。但是,我需要使用autolayout。

1 个答案:

答案 0 :(得分:1)

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

在叠加视图上设置的约束使得它被约束到滚动视图的顶部,右侧,底部和左侧边缘,因此被约束到滚动视图的内容区域而不是滚动视图的框架。

请参阅 https://developer.apple.com/library/ios/technotes/tn2154/_index.htmlAuto Layout Guide: Working with Scroll Views

  

滚动视图的边缘或边距与其之间的约束   内容附加到滚动视图的内容区域。

而不是将叠加视图限制到内容区域,而是将其约束到滚动视图的框架。根据上面的参考文献,这可以通过将叠加视图的宽度/高度约束到滚动视图,或者通过将叠加视图约束到滚动视图外部的视图来完成。