gpt4 book ai didi

ios - Self Sizing CollectionView inside a Self Sizing TableViewCell

转载 作者:行者123 更新时间:2023-12-05 05:01:53 30 4
gpt4 key购买 nike

我花了数周时间试图让它工作,并在这里、Apple 开发者论坛、Google 等上查看了许多不同的建议,但我仍然很紧张。任何帮助将不胜感激。

我有一个包含 TableView 的 ViewController。它不是全屏 tableView。

tableView 是用 customTableViewCells 构建的,每个 TableViewCells 都有一个 CollectionView。我遇到的问题是自动调整大小的 collectionView 和自动调整大小的 tableView 行似乎不起作用。我在网上找到了一些选项,但它们似乎只部分起作用。

这是我最初运行时得到的结果:

enter image description here

我包含了项目文件的链接,因为这可能比将代码复制到此处更容易: https://www.dropbox.com/sh/7a2dquvxg62aylt/AACK_TjDxT9eOShZaKi7vLYga?dl=0

一些在线“解决方法”并非在所有情况下都有效 - 例如如果您点击 CollectionView 内的其中一个按钮,它会被移除,并且 collectionView(以及随后的 TableView)应该调整大小,但同样我无法让它始终如一地工作。

我尝试过的一些解决方案:

UICollectionView Self Sizing Cells with Auto Layout

UICollectionView inside a UITableViewCell -- dynamic height?

Dynamic height for a UITableView based on a dynamic collection view

Auto-sizing UITableViewCell which contains UICollectionView

如有任何帮助,我们将不胜感激。

最佳答案

我想出了问题所在。有几件事需要修复:

  1. 您需要设置一个估计的行高(带有实际值)并将行高设置为自动。你反其道而行之。因此,请将您的 setupTableView 函数替换为下面的函数。另外,您需要设置您没有设置的委托(delegate)。因此,请确保将 UITableViewDelegate 添加到类名旁边,并像我在下面所做的那样在 setupTableView() 内部分配它。

    func setupTableView() {
    view.addSubview(tempTableView)
    NSLayoutConstraint.activate([
    tempTableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    tempTableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200),
    tempTableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    tempTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200)
    ])
    tempTableView.rowHeight = UITableView.automaticDimension
    tempTableView.estimatedRowHeight = 90
    tempTableView.register(CustomTableViewCell.self, forCellReuseIdentifier: CustomTableViewCell.cellIdentifier)
    tempTableView.dataSource = self
    tempTableView.delegate = self
    tempTableView.translatesAutoresizingMaskIntoConstraints = false
    tempTableView.layoutIfNeeded()
    }
  2. 在 cellForRowAt 中,添加 layoutIfNeeded 以确保单元格自动调整大小:

    extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    2
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tempTableView.dequeueReusableCell(withIdentifier: CustomTableViewCell.cellIdentifier) as! CustomTableViewCell
    cell.layoutIfNeeded()
    return cell
    }
    }
  3. 您的 CustomCollectionView 需要继承 UICollectionViewDelegateFlowLayout。

  4. 确保将 configuredCollectionViewLayout 变量分配给 collectionView:

    func setupCollectionView() {
    backgroundColor = .systemPink
    isScrollEnabled = false
    register(CustomCollectionViewCell.self, forCellWithReuseIdentifier: CustomCollectionViewCell.cellIdentifier)
    dataSource = self
    self.collectionViewLayout = configuredCollectionViewFlowLayout
    }
  5. 最后,添加这 3 个覆盖,使您的 collectionView 根据其内容自动调整大小(在 CustomCollectionView 内):

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

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

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

下面是如何在单击按钮时触发单元格重绘。我没有使用协议(protocol),但请这样做,这只是为了向您展示这个想法:

func tokenTapped(withTitle title: String) {
guard let indexOfItemToRemove = tokens.sampleData.firstIndex(where: {$0.name == title}) else { return }
tokens.sampleData.remove(at: indexOfItemToRemove)
DispatchQueue.main.async {
self.performBatchUpdates({
self.deleteItems(at: [IndexPath(item: indexOfItemToRemove, section: 0)])
}) { (true) in
if let tableView = self.superview?.superview?.superview as? UITableView {
print("tableview updates")
tableView.beginUpdates()
tableView.endUpdates()
DispatchQueue.main.async {
tableView.layoutIfNeeded()
}
}
}
}
}

关于ios - Self Sizing CollectionView inside a Self Sizing TableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62501148/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com