使用這個類進行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()
}
}
}
雖然,你應該明白,如果你將它嵌入到另一個滾動視圖中,單元格回收將無法工作。處理嵌套收集視圖的最佳方式描述如下here。
您是否在IB中設置了任何約束條件? –