使用此类使 UICollectionView 在每次内容更改时更新其内在内容大小。
class AutosizedCollectionView: UICollectionView {
override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
super.init(frame: frame, collectionViewLayout: layout)
registerObserver()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
registerObserver()
}
deinit {
unregisterObserver()
}
override var intrinsicContentSize: CGSize {
return contentSize
}
private func registerObserver() {
addObserver(self, forKeyPath: #keyPath(UICollectionView.contentSize), options: [], context: nil)
}
private func unregisterObserver() {
removeObserver(self, forKeyPath: #keyPath(UICollectionView.contentSize))
}
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?)
{
if keyPath == #keyPath(UICollectionView.contentSize) {
invalidateIntrinsicContentSize()
}
}
}
不过,您应该明白,如果将其嵌入到另一个滚动视图中,则单元格回收将不起作用。此处描述了处理嵌套集合视图的最受赞赏的方法。