如何使用 UIKit 在 Swift 5 中创建具有内在高度的 UITableView?

Posted

技术标签:

【中文标题】如何使用 UIKit 在 Swift 5 中创建具有内在高度的 UITableView?【英文标题】:How to create an UITableView with an intrinsic Height in Swift 5 using UIKit? 【发布时间】:2020-04-30 10:53:53 【问题描述】:

我在使用UITableViews 时遇到了问题。

AutoLayout 需要 UITableView 的固定高度约束,因此当我添加或删除 TableViewCells 时,高度不会改变

我的问题是,我使用的是 TableView inside ScrollView。这不是很好,因为两个元素都是可滚动的

我的计划是始终根据其内容高度调整 TableView 的大小。在这种情况下,TableView 可能永远不会滚动

到目前为止,我的想法如下,但由于某种原因,它并没有真正起作用:

tableView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: tableView.contentSize.height)

如果您对如何解决此问题有任何想法,请在下方发表评论。 首选没有类扩展等的更简单的解决方案;)

非常感谢大家!

【问题讨论】:

【参考方案1】:

您可以使用以下内容:

final class AutoSizingTableView: UITableView 

    override init(frame: CGRect, style: UITableView.Style) 
        super.init(frame: frame, style: style)
        setContentCompressionResistancePriority(.required, for: .vertical)
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        setContentCompressionResistancePriority(.required, for: .vertical)
    

    override var contentSize: CGSize 
        didSet 
            invalidateIntrinsicContentSize()
        
    

    override func reloadData() 
        super.reloadData()
        invalidateIntrinsicContentSize()
    

    override var intrinsicContentSize: CGSize 
        setNeedsLayout()
        layoutIfNeeded()
        return contentSize
    

基本上,它的作用是在重新加载 tableview 的数据或 contentSize 发生变化时将 intrinsicContentSize 设置为等于 contentSize。

但是你必须问自己一个问题:如果我不需要出队逻辑,我真的需要一个 tableview 吗?

【讨论】:

非常感谢您的回答。它运行良好。但是我还有一个问题:有什么方法可以禁用 Storyboard 中的 Missing Constraint Warning 吗? 是的,您可以设置高度限制,并将其优先级设置为中等 (~500)。那不应该破坏这个类,并且应该修复你的警告。如果您觉得厚脸皮,您还可以为高度设置所需的约束,并检查remove at runtime 选项。【参考方案2】:

您需要在 UIViewController 中重写 updateViewConstraints() 方法并设置 tableView 的新高度,如下所示:

override func updateViewConstraints() 
    tableViewHeightConstraint?.constant = tableView.contentSize.height
    super.updateViewConstraints()

当您需要使用新高度重新创建 tableView 时,请致电 self.view.setNeedsUpdateConstraints()

【讨论】:

以上是关于如何使用 UIKit 在 Swift 5 中创建具有内在高度的 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有任何第三方库的情况下使用 UIKit 在 iOS 应用程序中使用 Swift 5 中的 GIF?

如何在 swift 中使用 @resultbuilder 使用 UICollectionView?

如何在 Swift 中使用 UIKit 注册多个按钮点击?

如何使用 iOS Swift SKOverlay 和 UIKit 来交叉推广另一个应用程序?

自动布局,布局约束产生令人费解的结果 UIKit Swift 5

如何在 Swift UIKit 的 if 语句中显示多个警报?