我有一个水平UICollectionView
,它包含在垂直UICollectionView
的{{1}}标头中。垂直UICollectionView
的标题具有动态高度,该高度会因用户交互而发生变化(向下拖动外部UICollectionView
会将其展开,向上滚动则将其折叠)。水平UICollectionView
被限制为标头的大小,并且当标头降低高度时,其高度也会缩小。发生这种情况时,我会收到此错误
未定义UICollectionViewFlowLayout的行为,因为: 2018-07-19 13:42:09.959 IDAGIO [81891:2239798]物品的高度必须为 小于UICollectionView的高度减去部分插图 最高和最低值,减去内容将插入最高和最低值。 2018-07-19 13:42:09.959 IDAGIO [81891:2239798]请检查值 代表返回。
因为UICollectionView
的高度缩小,但是其像元保持原来的大小,因此比允许的要大(我在向上滚动时只会收到此错误,因此与任何插图无关,高度很好,它们只是在那个时间点不完全匹配。
每次获取垂直集合视图的滚动事件时,我已经尝试调用UICollectionView
,然后在
中返回集合视图的大小。
collectionView.collectionViewLayout.invalidateLayout()
但是布局更新总是有点太晚了,所以我仍然遇到上述错误。看起来也很奇怪,因为单元格的高度在视觉上也有点落后。
我的问题:有没有一种方法可以动态响应水平func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
的高度变化,从而相应地及时更新像元高度? (也许设置了一些高度限制条件,以自动使像元高度等于集合视图高度?)
我知道动态单元大小,但这通常意味着将单元限制为其内容的大小。我要实现的是始终将单元格(及其内容)的高度限制为集合视图的高度。
答案 0 :(得分:1)
在滚动事件中重新加载数据是选项之一,但由于涉及一次又一次地重新加载数据的所有计算,因此绝对不是最佳选择。通过子类化UICollectionViewLayout并在prepare()上进行所有计算,您可能会找到更好的解决方案。然后,您可以使用委托将滚动偏移量传递到自定义布局,并相应地调整单元格的大小。
答案 1 :(得分:1)
我自己找到了一个简单的解决方案,根本不必传递或存储滚动偏移量:
只是UICollectionViewFlowLayout的子类,覆盖shouldInvalidateLayout并将itemSize设置为新边界的大小。
override func shouldInvalidateLayout(forBoundsChange: CGRect) -> Bool {
if !forBoundsChange.size.equalTo(collectionView!.bounds.size) {
itemSize = forBoundsChange.size
return true
}
return false
}
在Swift 4.2中
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
if !newBounds.size.equalTo(collectionView!.bounds.size) {
itemSize = newBounds.size
return true
}
return false
}
答案 2 :(得分:0)
const test = new Vector2();
console.log(test.x, test.y);
const test2 = new Vector2Altitude();
test2.altitude = 1000;
console.log(test2.x, test2.y, test2.altitude, new Uint8Array(test2._data));
具有一个源自UICollectionView
的属性,称为UIScrollView
,如果将collectionView的项目大小设置为false,则将其设置为false应该可以解决您的问题。 collectionView的边界。
因为scrollView可以调整插图,从而依次更改contentinsetadjustmentbehavior
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
基本上是这样设置的:
collectionView.adjustedContentInset