如何动态改变UICollectionView的高度以适应内容大小
How to dynamically change the height of UICollectionView to adapt to content size
我在同一个视图中有两个集合视图,我想降低它们的高度,以便它们适应内容大小。但是,高度只能减少而不能增加超过情节提要中设置的初始值。我怎样才能做到这一点?
到目前为止,我每次添加新数据时都尝试从高度约束出口更改 collectionView 高度,但我没有得到正确的结果。
我试着用这段代码改变它:
self.deadlineCollectionViewHeight.constant = deadlinesCollectionView.collectionViewLayout.collectionViewContentSize.height
添加高度限制出口,然后根据需要设置。
collectionViewheightConstraint.constant = modifierCollectionView.contentSize.height + 4
您在什么时候尝试读取 collectionViewContentSize
值?
如果您在 reloadData()
调用之后立即执行此操作 - 这可能不会为您提供准确的结果,因为这些调用被推迟到主线程上的某个时间点执行。执行 reloadData()
调用后内容大小不会立即改变。
尝试以下操作:
- 像这样在 class 中声明一个变量。
private var contentSizeObservation: NSKeyValueObservation?
- 开始观察 contentSize 的变化。
contentSizeObservation = deadlinesCollectionView.observe(\.contentSize, options: .new, changeHandler: { [weak self] (cv, _) in
guard let self = self else { return }
self.deadlineCollectionViewHeight.constant = cv.collectionViewLayout.collectionViewContentSize.height
})
- 不要忘记在
deinit
调用 - 中清理它
deinit {
contentSizeObservation?.invalidate()
}
这种方法将确保您的 collectionView 的高度始终与其内容一样大。
我在同一个视图中有两个集合视图,我想降低它们的高度,以便它们适应内容大小。但是,高度只能减少而不能增加超过情节提要中设置的初始值。我怎样才能做到这一点?
到目前为止,我每次添加新数据时都尝试从高度约束出口更改 collectionView 高度,但我没有得到正确的结果。 我试着用这段代码改变它:
self.deadlineCollectionViewHeight.constant = deadlinesCollectionView.collectionViewLayout.collectionViewContentSize.height
添加高度限制出口,然后根据需要设置。
collectionViewheightConstraint.constant = modifierCollectionView.contentSize.height + 4
您在什么时候尝试读取 collectionViewContentSize
值?
如果您在 reloadData()
调用之后立即执行此操作 - 这可能不会为您提供准确的结果,因为这些调用被推迟到主线程上的某个时间点执行。执行 reloadData()
调用后内容大小不会立即改变。
尝试以下操作:
- 像这样在 class 中声明一个变量。
private var contentSizeObservation: NSKeyValueObservation?
- 开始观察 contentSize 的变化。
contentSizeObservation = deadlinesCollectionView.observe(\.contentSize, options: .new, changeHandler: { [weak self] (cv, _) in
guard let self = self else { return }
self.deadlineCollectionViewHeight.constant = cv.collectionViewLayout.collectionViewContentSize.height
})
- 不要忘记在
deinit
调用 - 中清理它
deinit {
contentSizeObservation?.invalidate()
}
这种方法将确保您的 collectionView 的高度始终与其内容一样大。