使用autolayout将子视图添加到UITableView不会';不要定格

使用autolayout将子视图添加到UITableView不会';不要定格,uitableview,uiview,uiviewcontroller,autolayout,Uitableview,Uiview,Uiviewcontroller,Autolayout,我使用以下代码将覆盖视图添加到视图中: UIView *overlayView = [[UIView alloc] init]; overlayView.backgroundColor = [UIColor redColor]; [self.view addSubview:overlayView]; overlayView.translatesAutoresizingMaskIntoConstraints = NO; NSDictionary *views = NSDictionaryOfV

我使用以下代码将覆盖视图添加到视图中:

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]];
如果我将此代码放在
UIViewController
viewDidLoad
方法中,它工作正常。但是,如果在
UITableViewController
中执行相同操作,则覆盖视图将获得零帧

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

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

我错过了什么


PS:我知道我可以用
self.view.bounds
作为frame实例化覆盖视图,并且它可以工作。但是,我需要使用autolayout。

怀疑这是因为UITableView是一个UIScrollView,而autolayout在使用建立自己边界系统的视图(如滚动视图或表格视图)时有一些注意事项

覆盖视图上设置的约束是,它被约束到滚动视图的上、右、下和左边缘,从而约束到滚动视图的内容区域,而不是滚动视图的框架

看 以及:

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


与其将覆盖视图约束到内容区域,不如将其约束到滚动视图的框架。根据上述参考,这可以通过将覆盖视图的宽度/高度限制为滚动视图来实现,或者通过将覆盖视图约束到滚动视图之外的视图。

怀疑这是因为UITableView是UIScrollView,而auto layout在使用建立自己边界系统的视图(如滚动视图或表视图)时有一些注意事项

覆盖视图上设置的约束是,它被约束到滚动视图的上、右、下和左边缘,从而约束到滚动视图的内容区域,而不是滚动视图的框架

看 以及:

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


与其将覆盖视图约束到内容区域,不如将其约束到滚动视图的框架。根据以上参考,这可以通过将覆盖视图的宽度/高度约束到滚动视图,或者将覆盖视图约束到滚动视图之外的视图来实现。

是的,我想是这样的。我确实用其他方法解决了这个问题,但我更希望能够使用autolayout。在iOS 11中,您可以使用表视图的frameLayoutGuide属性。是的,我想是这样的。我确实用其他方法解决了这个问题,但我更希望能够使用autolayout。在iOS 11中,您可以使用表视图的frameLayoutGuide属性。