UICollectionView不调用intrinsicContentSize
我有一个UICollectionViewController
,它生成具有随机颜色的单元格用于测试目的。 既然UICollectionViewController
嵌入在UIScrollView
,我希望scrollView与它的contentSize
大小相同。
我创建了UICollectionView
的子类,实现了intrinsicContentSize
方法,并将UICollectionView
的类设置为IB中的自定义类。 然而, intrinsicContentSize
永远不会被调用。 我有一个与UITableView
完全相同的设置,它在那里完美无缺。
有什么想法吗?
- (CGSize)intrinsicContentSize { [self layoutIfNeeded]; return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height); }
我不确定为什么会这样。 这是此问题的另一种解决方案。 在UICollectionView
对象上设置高度约束。 然后将其constant
设置为等于self.collectionView.contentSize.height
。 我在我的应用程序中使用了类似的方法,虽然我有UITextView
而不是UICollectionView
。
更新:我已经找到了使用intrinsicContentSize
: UIScrollView中的UITextView使用自动布局
正确的答案是做这样的事情
- (CGSize)intrinsicContentSize { return self.collectionViewLayout.collectionViewContentSize; }
每当您认为需要更改时调用-invalidateContentSize(例如在reloadData之后)。
在Interface Builder中,您可能需要设置占位符内在大小约束以避免错误。
这是-intrinsicContentSize的子类化和重写,如果你想增长一个集合视图的框架,直到它被一个兄弟或父视图约束
每次更改内容时,使用此类使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() } } }
但是,您应该明白,如果将其嵌入到另一个滚动视图中,则单元格回收将不起作用。 这里描述了最受欢迎的处理嵌套集合视图的方法。