代码之家  ›  专栏  ›  技术社区  ›  bitops

如何使用nslayoutConstraint以编程方式在容器中居中表页脚视图?

  •  0
  • bitops  · 技术社区  · 6 年前

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

    我正在尝试为列表的空状态添加一些代码,但尚未添加收藏夹。我想把 UIView tableFooter 然后放一个 UILabel 在那个视图的中心。我希望视图占据屏幕中所有可用空间。

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

    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)>
    

    非常感谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Shehata Gamal    6 年前

    您还需要添加Y约束,例如

    let topConstraint = NSLayoutConstraint(
      item: label,
      attribute: .top,
      relatedBy: .equal,
      toItem: footer,
      attribute: .top,
      multiplier: 1,
      constant: 10
    )
    

    为标签设置这个

    label.translatesAutoresizingMaskIntoConstraints = false