固定单元格的高度为UICollectionView的高度

时间:2018-07-19 12:00:08

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout

我有一个水平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 { 的高度变化,从而相应地及时更新像元高度? (也许设置了一些高度限制条件,以自动使像元高度等于集合视图高度?)

我知道动态单元大小,但这通常意味着将单元限制为其内容的大小。我要实现的是始终将单元格(及其内容)的高度限制为集合视图的高度。

3 个答案:

答案 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