[英]Calling UICollectionView#reloadData in UICollectionViewDelegate#collectionView:didSelectItemAtIndexPath: hides all cells
[英]Resizing UICollectionView cells with collectionView(_:layout:sizeForItemAt:) without calling reloadData()
我正在尝试实现一个UICollectionViewCell
,其中包含一个UITextView
,该UITextView
在运行时随着用户输入的文本数量的增加而调整大小,并根据文本框的大小向上或向下移动其上方的单元格。 (这个UICollectionView
是用UICollectionViewDelegateFlowLayout
实现的)
当用户通过UITextViewDelegate
的textViewDidChange()
方法将文本输入到单元格时,我能够在运行时调整实际单元格的大小。 但是,这不会改变其他单元格的位置,因为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.