【问题标题】:How can I make self sizing UITableViewCell with a UIStackView inside it我怎样才能让自己调整大小的 UITableViewCell 里面有一个 UIStackView
【发布时间】:2016-08-25 22:18:47
【问题描述】:

我无法在UITableViewCell 内部实现自我调整大小UIStackView

对于UITableViewCell,我正在做这样的事情:

在代码上我正在这样做:

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.estimatedRowHeight = 80
}

但是当我运行应用程序时,UITableViewCells 不会调整大小:

UITableViewCell 内部设置 UIStackView 时,我错过了什么?

【问题讨论】:

  • FWIW distribution 属性很重要。如果设置不当,有时会得到意想不到的结果。

标签: ios swift uitableview uistackview


【解决方案1】:

单元格大小调整工作正常。您的问题是您为 Stack View 设置了固定高度。

水平堆栈视图中的视图将其height 设置为64,很可能其标准优先级设置为1000。此 Stack View 很可能将其分发设置为 Fill。你基本上告诉堆栈视图包含的图像必须完全填充堆栈视图,高度为64。这也将堆栈视图限制为64,并限制了视图之外的垂直堆栈视图。如果您希望 View 旁边的垂直 Stack View 大于 64,请将包含 View 的水平 Stack View 的分布更改为 Center

【讨论】:

    【解决方案2】:

    你有多行标签吗?如果是这样,请确保您将 IB 中的 lines 属性设置为 0 而不是 1。

    固定 stackView 的顶部和底部。

    如果不这样做,请检查以下内容:

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

    【讨论】:

    • 我之前添加了图钉,它显示在我在问题中添加的图像上。我添加了两个委托方法,但仍然无法正常工作
    【解决方案3】:

    在 UITableViewCell 上获得自动调整大小的单元格的自动布局的技巧是确保您有约束将每个子视图固定在所有侧面 - 也就是说,每个子视图应该具有前导、顶部、尾随和底部约束。然后,子视图的固有高度将用于指示每个单元格的高度。

    这里是a nice tutorial,它将帮助您度过难关。

    【讨论】:

    • 感谢您的回答。我有所有的引脚(前导、顶部、尾随和底部),但我使用的是UIStackView,它有所有的标签。问题是UIStackView 的内容不会自动调整大小。
    【解决方案4】:

    尝试固定堆栈视图本身。请记住,stackView 有责任平均空间、均匀分布等,因此它需要使用自身与其 superView 之间的约束来解决所有这些问题。

    这是apple explanation

    HTH

    【讨论】:

    • 我需要在它自己和它的 superView 之间设置哪些约束?
    • 我在UITableViewCell 中添加了等宽的UIStackView,现在UIStackView 调整了大小,但UITableViewCell 没有调整大小
    【解决方案5】:
    open class IntrinsicHeightTableView: UITableView {
    
    open override var contentSize: CGSize {
        didSet { invalidateIntrinsicContentSize() }
    }
    
    open override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多