gpt4 book ai didi

ios - 使用 collectionView(_ :layout:sizeForItemAt:) without calling reloadData()) 调整 UICollectionView 单元格的大小

转载 作者:行者123 更新时间:2023-11-28 05:39:29 24 4
gpt4 key购买 nike

我正在尝试实现一个 UICollectionViewCell,其中包含一个 UITextView,它会在运行时随着用户在其中输入的文本量的增加而调整大小,并移动单元格根据文本框的大小向上或向下移动。 (此 UICollectionView 是使用 UICollectionViewDelegateFlowLayout 实现的)

当用户通过 UITextViewDelegatetextViewDidChange() 方法向单元格中输入文本时,我能够在运行时调整实际单元格的大小。然而,这不会改变其他单元格的位置,因为 collectionView(\_:layout:sizeForItemAt:) 不会立即被调用。如果我在 UICollectionView 类中调用 reloadData(),我可以触发 collectionView(_:layout:sizeForItemAt:),它会重新定位其他单元格相对于感兴趣的单元格,但问题是这会重新加载所有对象,并且键盘会立即关闭。

有没有办法在不调用 reloadData() 的情况下触发 collectionView(_:layout:sizeForItemAt:)

另一个我想知道的问题是 Resize CollectionView Cell during runtime without reloading但他们的问题也没有得到回答。

最佳答案

我不确定调整大小的触发事件是什么,但我能想到的最简单的方法是传递一个 weak 对 collectionView 的引用创建它时添加到您的 collectionViewCell 中。确保它很弱,因为单元格一直在创建和销毁,而您不希望有一个保留周期。

一种方法可能是只使用 didSet 作为单元格的 bounds。我不认为这会在您初始化单元格时执行任何操作,但只要单个单元格的边界发生变化,您就可以在那里调用您的方法。我没有测试过这种方法,但我认为这是一种惰性、低提升、最少簿记的解决方案。

这是“诗人物理学”的样子:

class YourCell: UICollectionViewCell {

weak var collectionView: UICollectionView?

// Whatever other stuff you need on your cell

override var bounds: CGRect {
didSet {
// Whenever the bounds get set, the collectionView's layout will be invalidated.
invalidateCollectionViewLayout()
}
}

private func invalidateCollectionViewLayout() {
guard let collectionView = collectionView else { return }
collectionView.collectionViewLayout.invalidateLayout()
}
}

关于ios - 使用 collectionView(_ :layout:sizeForItemAt:) without calling reloadData()) 调整 UICollectionView 单元格的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57351416/

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