如何使用自动布局约束在表格单元格中拟合具有可变大小的2个标签,使用estimatedHeightForRowAtIndexPath

时间:2016-08-11 21:03:14

标签: ios swift ios-autolayout

我有以下约束的布局。

当我运行它时,它看起来就像所希望的那样。单元格高度调整为适合所有文本。

但是,我在问题导航器中看到以下警告,我不明白为什么。

2个视图垂直模糊

  • 查看
  • 的高度和垂直位置不明确
  • 查看
  • 的高度不明确

布局: enter image description here

约束:

  • 查看(单元格中所有元素的单元格封面视图)

    enter image description here

    • 查看(选项1包装视图)

      enter image description here

      • 按钮(选项1按钮)

        enter image description here

      • 标签(选项1标签)

        enter image description here

    • 查看(选项2包装视图)

      enter image description here

      • 按钮(选项2按钮)

        enter image description here

      • 标签(选项2标签)

        enter image description here

表视图控制器代码:

    import UIKit

class SelectionTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //Hide navigation bar
        self.navigationController?.navigationBarHidden = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: Hide status bar
    override func prefersStatusBarHidden() -> Bool {
        return true
    }

    // MARK: - Table view data source
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

    override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

}

2 个答案:

答案 0 :(得分:0)

我认为你的按钮对他们的超级视图没有任何顶部和底部限制'边缘。因此,他们的超级视图(两个包装器视图)不知道它们的高度。

答案 1 :(得分:-1)

故事板似乎在抱怨,因为它不知道单元格视图的高度,它不知道你将在运行时使用estimatedHeightForRowAtIndexPath提供高度。所有约束都与超视图或其他视图相关,因此有无限的方法来满足这些约束。

简单地抑制这些警告的最简单方法是给单元格的内容视图一个明确的高度,然后在右侧导航器上检查该约束的“在构建时删除”框(在左侧导航器中找到它,并点击它。)

enter image description here

给出一个明确的数字将允许编译器为这些视图的高度和y位置提供显式值,这些值应解决您获得的警告。然后删除该约束应该允许单元格使用您实现的方法在代码中动态调整大小。