Ios 如何使用NSLayoutConstraint以编程方式在容器中居中表尾视图?

Ios 如何使用NSLayoutConstraint以编程方式在容器中居中表尾视图?,ios,swift,nslayoutconstraint,Ios,Swift,Nslayoutconstraint,我正在为一个有收藏夹的应用程序构建一个屏幕。此屏幕将显示用户喜欢的项目列表。这个列表将显示在一个表视图中,非常普通 我正在尝试为列表的空状态添加一点代码,此时还没有添加收藏夹。我想在tableFooter中放置一个ui视图,然后在该视图的中心放置一个ui标签。我希望视图占据屏幕内的所有可用空间 到目前为止,这就是我所拥有的: self.tableView.tableFooterView = buildTableViewFooter() 非常不言自明 func buildTableViewFoo

我正在为一个有收藏夹的应用程序构建一个屏幕。此屏幕将显示用户喜欢的项目列表。这个列表将显示在一个表视图中,非常普通

我正在尝试为列表的空状态添加一点代码,此时还没有添加收藏夹。我想在
tableFooter
中放置一个
ui视图
,然后在该视图的中心放置一个
ui标签
。我希望视图占据屏幕内的所有可用空间

到目前为止,这就是我所拥有的:

self.tableView.tableFooterView = buildTableViewFooter()
非常不言自明

func buildTableViewFooter() -> UIView {
  let footer = UIView(frame: self.tableView.frame)
  let label = UILabel()
  label.text = "Use the heart icon to add favorites"
  label.font = UIFont.italicSystemFont(ofSize: 21.0)
  label.textColor = UIColor.lightGray
  label.textAlignment = .center
  label.numberOfLines = 0
  let centerHorizontalConstraint = NSLayoutConstraint(
      item: label,
      attribute: .centerX,
      relatedBy: .equal,
      toItem: footer,
      attribute: .centerX,
      multiplier: 1,
      constant: 0
  )
  footer.addSubview(label)
  footer.addConstraints([
      centerHorizontalConstraint,
  ])
  return footer
}
当我运行应用程序时,我可以判断我的方法正在启动,并且视图正在成功创建。但是,我在屏幕的任何地方都看不到文本。
LayoutConstraints
引擎试图提供帮助,但我不太确定它想告诉我什么:

[LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x60400028a9b0 h=--& v=--& UILabel:0x7fa8565417d0'Use the heart icon to add...'.midX == 0   (active)>",
    "<NSLayoutConstraint:0x604000290f90 UILabel:0x7fa8565417d0'Use the heart icon to add...'.centerX == UIView:0x7fa856514e60.centerX   (active)>",
    "<NSAutoresizingMaskLayoutConstraint:0x6040002931f0 h=--& v=--& 'UIView-Encapsulated-Layout-Left' UIView:0x7fa856514e60.minX == 0   (active, names: '|':UITableView:0x7fa857889a00 )>",
    "<NSLayoutConstraint:0x60400028a2d0 'UIView-Encapsulated-Layout-Width' UIView:0x7fa856514e60.width == 375   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x604000290f90 UILabel:0x7fa8565417d0'Use the heart icon to add...'.centerX == UIView:0x7fa856514e60.centerX   (active)>
[LayoutConstraints]无法同时满足约束。
可能下面列表中至少有一个约束是您不想要的。
试试这个:
(1) 看看每一个约束,试着找出你不期望的;
(2) 找到添加了不需要的约束的代码,然后修复它。
(注意:如果您看到不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性TranslatesAutoResizingMaskToConstraints的文档)
(
"",
"",
"",
""
)
将尝试通过打破约束进行恢复

非常感谢

您还需要添加y约束,如

let topConstraint = NSLayoutConstraint(
  item: label,
  attribute: .top,
  relatedBy: .equal,
  toItem: footer,
  attribute: .top,
  multiplier: 1,
  constant: 10
)
并将此设置为标签

label.translatesAutoresizingMaskIntoConstraints = false