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

标签 ios swift uicollectionview uicollectionviewcell uicollectionviewflowlayout

我正在尝试实现一个 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/

相关文章:

objective-c - 转换NSDate

ios - 将 Array 与 Osmosis 结合使用

ios - Swift:从 AppDelegate 设置 ViewController 背景颜色

javascript - 将 [origin].concat(ray(nextStep)) 从 JavaScript 移植到 Swift

ios - 简单的collectionView动画

ios - 3 秒后 UIRefreshControl endRefreshing

ios - 使用 Passkit 库读取二维条码

swift - 为调用异步方法的异步调度队列实现完成处理程序

ios - 如何获取 UITableView 内的 UICollectionView 内的数组数组并返回正确数量的项目?

ios - Collection View 单元格刷新未发生