NSLayoutContracts在UITableViewController上应用不一致(显然)

NSLayoutContracts在UITableViewController上应用不一致(显然),uitableview,ios11,nslayoutconstraint,Uitableview,Ios11,Nslayoutconstraint,我试图在UITableViewController上添加某种覆盖菜单。我的第一个目标是在一个非常贫瘠的控制器上,在屏幕底部显示一个背景视图。我正在使用以下代码以编程方式执行此操作,该代码位于条形按钮的回调中,即在原始布局出现后调用: print("self.tableView.frame=\(self.tableView.frame)") let settingsView = UIView() settingsView.translatesAutoresizingMask

我试图在
UITableViewController
上添加某种覆盖菜单。我的第一个目标是在一个非常贫瘠的控制器上,在屏幕底部显示一个背景视图。我正在使用以下代码以编程方式执行此操作,该代码位于条形按钮的回调中,即在原始布局出现后调用:

    print("self.tableView.frame=\(self.tableView.frame)")
    let settingsView = UIView()
    settingsView.translatesAutoresizingMaskIntoConstraints = false
    settingsView.backgroundColor = UIColor.cyan.withAlphaComponent(0.5)
    self.view.addSubview(settingsView)
    self.view.addConstraints([
        NSLayoutConstraint(item: settingsView, attribute: .bottom, relatedBy: .equal, toItem: self.tableView, attribute: .bottom, multiplier: 1, constant: 50),
        NSLayoutConstraint(item: settingsView, attribute: .leading, relatedBy: .equal, toItem: self.tableView, attribute: .leading, multiplier: 1, constant: 0),
        NSLayoutConstraint(item: settingsView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: self.view.frame.width),
        //NSLayoutConstraint(item: settingsView, attribute: .trailing, relatedBy: .equal, toItem: self.tableView, attribute: .trailing, multiplier: 1, constant: 0),
        NSLayoutConstraint(item: settingsView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100)
        ])
    self.view.setNeedsLayout()
但结果与我预期的不一样:我的视图的底部实际上与上边距对齐,而不是位于屏幕的底部(因此,
50
值可以通过所附图片上的导航栏看到青色)。为什么呢?如果我将第一个约束更改为对齐顶部而不是底部,则效果很好(当然是在顶部)

此外,我还感到惊讶的是,我不得不将第四个约束(被注释掉的约束,应该是将视图的右边缘与屏幕的右边缘对齐)替换为第三个约束(设置宽度,但不知何故看起来不太干净)。如果我使用第四个,那么视图将完全消失(我猜它的宽度为0)。原因是什么

开头的
print
命令确保
tableView
具有正确的大小:

self.tableView.frame=(0.0, 0.0, 375.0, 667.0)
这一切似乎都很琐碎,所以这里肯定有我没有看到的东西


因此这里的问题似乎真的是
UITableView(Controller)
,因为这些约束在正常的
UIView(Controller)
中可以正常工作。它周围的
UINavigationController
在此不起作用。出于某种原因,似乎
.bottom
不能在表视图上使用拖尾
锚-如果有人知道为什么或者可以向我解释如何做,请做

无论如何,我已经通过使用视图的实际测量值来解决这个问题,这些测量值是正确的。因此,第一个约束变成:

NSLayoutConstraint(item: settingsView, 
    attribute: .bottom, 
    relatedBy: .equal, 
    toItem: self.view, 
    attribute: .top, 
    multiplier: 1, 
    constant: self.view.frame.height + self.view.bounds.minY)
这会将视图很好地显示在屏幕底部。常量中的
self.view.bounds.minY
说明屏幕顶部存在导航栏。我仍然觉得有点像“黑客”,特别是因为我不明白为什么其他版本不起作用