为表格视图的高度分配上限?

Posted

技术标签:

【中文标题】为表格视图的高度分配上限?【英文标题】:Assign an upper bound for the height of a tableview? 【发布时间】:2018-05-16 22:33:09 【问题描述】:

我有一个高度可以动态调整的表格视图。调整高度,使 tableview 只包含一定数量的行,并且没有空行。因此,如果只有 2 行,则高度较小,如果有 4 行,则高度较大。但是,我不希望它的高度超过某个点。如何允许动态调整高度,同时不让高度超过某个点?

这是我的代码:

@IBOutlet var tableView: UITableView!

@IBOutlet var tableViewHeightConstraint: NSLayoutConstraint!

var items: [String] = ["Swift", "Is", "So", "Amazing"]

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return self.items.count;


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    var cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "Cell") as! UITableViewCell

    // Make sure the table view cell separator spans the whole width
    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsets.zero
    cell.layoutMargins = UIEdgeInsets.zero

    cell.textLabel?.text = self.items[indexPath.row]

    return cell


override func viewWillAppear(_ animated: Bool) 
    // Adjust the height of the tableview
    tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.frame.size.width, height: tableView.contentSize.height)

    // Add a border to the tableView
    tableView.layer.borderWidth = 1
    tableView.layer.borderColor = UIColor.black.cgColor
    print("We ran ViewWillAppear")


// This function is used for adjusting the height of the tableview
override func viewDidLayoutSubviews()
    tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.frame.size.width, height: tableView.contentSize.height)
    tableView.reloadData()


// Allow cell deletion in tableview
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? 

    let delete = UITableViewRowAction(style: .destructive, title: "Delete")  (action, indexPath) in
        // delete item at indexPath
        self.items.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)
        self.tableViewHeightConstraint.constant = self.tableView.contentSize.height - 44
        print(self.items)
        print("Number of rows: \(tableView.numberOfRows(inSection: 0))")
    

    delete.backgroundColor = UIColor.blue
    return [delete]

【问题讨论】:

您可以对设置高度约束的限制进行编码,例如使用 max 函数,或者您可以为 tableview 高度约束设置较低的优先级并创建其他限制高度的约束表格视图 我尝试编辑高度约束,以便在 Main.storyboard 中它是 tableView.height "小于或等于" 352,但它会引发错误。任何想法为什么会这样? 你正在尝试正确的事情。您需要查看的是 Content Higging Priority 和 Content Compression Resistance Priority,设置后将消除错误并满足您的标准。 你需要两个约束;设置高度的一个(这是您在代码中设置的那个)。将此约束的优先级设置为 999。然后创建一个优先级为 1000 的 我的第一个约束在 main.storyboard 中,就像以前一样。这个约束是 tableView.height “等于” 176,优先级 999。我添加了第二个约束,即 tableView.height “小于或等于”352,优先级 1000。352 相当于 tableView 中的 8 行。但是,如果有 9 行,它仍然显示 9 行(而不是强制最后一行不出现,这是我想要的)。任何想法如何解决这个问题? 【参考方案1】:

viewWillAppear,你可以试试

let limit:CGFloat = 900.0

if tableView.contentSize.height  < limit 
    tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.frame.size.width, height: tableView.contentSize.height)

else 
    tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.frame.size.width, height: limit )

或将值设置为

tableViewHeightConstraint.constant = ( tableView.contentSize.height < limit ) ? tableView.contentSize.height : limit

self.view.layoutIfNeeded()

【讨论】:

如果我在 Main.storyboard 中有高度限制,您的第一个解决方案是否适用于所有情况? 是的,如果你把它放在 viewDidLayoutSubviews 太棒了!我通过使用上面的第一种方法解决了这个问题。我将第一个块中的内容放在 viewDidLayout Subviews 函数中。同时,我对 tableView 的高度有一个约束,在上面代码的每个 if/else 块中也进行了修改。我只需要为 tableView 使用一个约束。

以上是关于为表格视图的高度分配上限?的主要内容,如果未能解决你的问题,请参考以下文章

表格视图单元格高度

自动布局高度成比例但有上限约束

表格视图的自动高度

使用 Auto Layout 将 UITableView 的高度设置为其内容的高度

具有动态高度单元格但所有单元格同时显示的 iOS 表格视图

设置 tableviewcell 高度以显示具有动态高度单元格的完整内部/嵌套 uitableview