【问题标题】:UITableView inside UICollectionViewCell: expand to full sizeUICollectionViewCell 内的 UITableView:展开为全尺寸
【发布时间】:2020-09-14 04:31:16
【问题描述】:

我正在寻找一种实现布局的方法,如下所示:

本质上,它由UICollectionViewCell 和其中的UITableView 实例组成。 UICollectionViewCell 包含很少的其他补充元素,但这些与此问题无关。

我希望 UITableView 完全展开,即显示所有单元格。我选择了UITableView,因为它正是我需要的风格。

问题是UITableView 没有完全展开。从技术上讲,我希望UITableView 的大小等于它的contentSize

我正在使用 AutoLayout 来计算 UICollectionViewCell 的大小,因此“可调整大小”的 UITableView 会派上用场。

到目前为止,我已经尝试过使用这种方法:

import UIKit

final class FullSizeTableView: UITableView {
    override var intrinsicContentSize: CGSize {
        return contentSize
    }
}

然后在UICollectionViewCell 中使用FullSizeTableView

我已将UITableView 限制在所有 4 个侧面,顶部到 UIStackView,底部、左侧和右侧到 ContentView

但是,结果如下所示:

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4 /// Meanwhile, Returning 4 rows in the DataSource
    }

所以,我猜,AutoLayout 似乎不尊重UITableView 的实际大小。 我没有考虑到哪些潜在的陷阱?

我对@9​​87654345@ 的目标是始终完全展开并以全尺寸显示。

更新1:

滚动已被禁用

【问题讨论】:

  • UITableView is-a UIScrollView。内部内容(单元格)永远不会强制滚动视图展开。您需要使用显式约束来强制执行高度。尽管您使用 intrinsicContentSize 的方法看起来确实是一条逻辑路径,但滚动视图很奇怪。
  • 我认为禁用可滚动的tableview来实现这一点。
  • @King.lbt 它已经被禁用,所以不起作用。
  • @WarrenBurton 有趣的建议。我应该限制什么?
  • 您在控制台中是否有任何突破性限制?跟进@WarrenBurton 的评论,如果您的表格视图行不是动态高度,您可以向表格视图添加高度约束numberOfRows * rowHeight。但在这一点上,我会质疑表视图的使用。因为一个完整的高度表视图将一次分配所有单元格而不做任何出队。您不妨只使用滚动视图并自己添加子视图。

标签: ios swift uitableview autolayout uicollectionviewcell


【解决方案1】:

您可以计算每一行的高度并将您的 tableView 的高度设置为总和。

这是一个应该做到这一点的简单函数(尚未对其进行测试,因此可能需要一些调整):

func calculateTableViewContentHeight(tableView: UITableView) -> CGFloat {
    let rows = tableView.numberOfRows(inSection: 0) // adapte to your needs
    var totalHeight: CGFloat = 0
    for i in 0..<rows {
        totalHeight += tableView.rectForRow(at: IndexPath(row: i, section: 0)).height
    }
    return totalHeight
}

【讨论】:

  • 有趣的方法,我会测试它并返回!
【解决方案2】:

试试这个 -

class ContentSizedTableView: UITableView {
override var contentSize: CGSize {
    didSet{
        self.invalidateIntrinsicContentSize()
    }
}

override var intrinsicContentSize: CGSize {
    self.layoutIfNeeded()
    return contentSize
}

override func reloadData() {
    super.reloadData()
    invalidateIntrinsicContentSize()
    layoutIfNeeded()
}
}

【讨论】:

  • 谢谢。您的解决方案正是我正在寻找的解决方案。它与 AutoLayout 和 StackViews 以及 Self-Sizing 单元格配合得很好。我已经达到了我想要的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2021-04-25
相关资源
最近更新 更多