bugfix> ios > 投稿

お気に入りのあるアプリの画面を作成しています。この画面には、ユーザーがお気に入りにしたアイテムのリストが表示されます。このリストは、テーブルビューに表示される予定です。

お気に入りがまだ追加されていないときに、リストの空の状態に小さなコードを追加しようとしています。私は 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 件
  • 次のようなy制約も追加する必要があります

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

    ラベルにこれを設定します

    label.translatesAutoresizingMaskIntoConstraints = false
    
    

あなたの答え