繁体   English   中英

使用 collectionView(_:layout:sizeForItemAt:) 调整 UICollectionView 单元格而不调用 reloadData()

[英]Resizing UICollectionView cells with collectionView(_:layout:sizeForItemAt:) without calling reloadData()

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

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

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

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

我不确定您的触发事件用于调整大小,但我能想到的最简单的方法是在创建 collectionView 时将它的weak引用传递给 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()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM