iOS 10
在 iOS 10 中,引入了一项新功能,即Cell Prefetching
. 它会让SupplementaryView
崩溃的动态位置。为了以旧行为运行,它需要禁用prefetchingEnabled
. 默认情况下,它true
在 iOS 10 中。
// Obj-C
// This function is available in iOS 10. Disable it for dynamic position of `SupplementaryView `.
if ([self.collectionView respondsToSelector:@selector(setPrefetchingEnabled:)]) {
self.collectionView.prefetchingEnabled = false;
}
// Swift
if #available(iOS 10, *) {
// Thanks @maksa
collectionView.prefetchingEnabled = false
// Swift 3 style
colView.isPrefetchingEnabled = false
}
我讨厌这个问题。我花了 2 天时间解决这个问题。关于Cell Pre-fetch @iOS 10的参考。
iOS 9 及之前...
@Away Lin 是对的。. 我通过实现该委托方法解决了同样的问题。
我Custom UICollectionViewLayout
将修改layoutAttributesForElementsInRect
. 截面位置是动态的,而不是静态的。因此,我收到有关layout attributes for supplementary item at index path ... changed from ... to ...
. 在更改之前,invalideLayout
应调用相关方法。
并且,在实现了这个return的委托方法之后,在滚动的时候会调用true
该方法。默认情况下,它返回.invalidateLayoutWithContext:
UICollectionViewLayout
false
- (BOOL) shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
return YES;
}
返回值 如果集合视图需要更新布局,则返回 true;如果不需要更改布局,则返回 false。
讨论 此方法的默认实现返回 false。子类可以覆盖它并根据集合视图边界的更改是否需要更改单元格和补充视图的布局来返回适当的值。
如果集合视图的边界发生变化并且此方法返回 true,则集合视图通过调用 invalidateLayoutWithContext: 方法使布局无效。
可用性 适用于 iOS 6.0 及更高版本。
和更多 ...
GitHub 上一个不错的示例项目,用于自定义 UICollectionViewLayout。