3

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

当用户textViewDidChange()通过UITextViewDelegate. 但是,这不会改变其他单元格的位置,因为collectionView(\_:layout:sizeForItemAt:)不会立即调用。如果我reloadData()UICollectionView类中调用,我可以触发 collectionView(_:layout:sizeForItemAt:),这会相对于感兴趣的单元格重新定位其他单元格,但问题是这会重新加载所有对象和键盘立即关闭。

有没有办法collectionView(_:layout:sizeForItemAt:)不调用就触发reloadData()

我想知道的另一个问题是在运行时调整 CollectionView Cell 的大小而不重新加载,但他们的问题也没有得到回答。

4

1 回答 1

3

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

一种方法可能是只使用单元格的didSetfor 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()
    }
}
于 2019-08-05T03:42:09.700 回答