gpt4 book ai didi

ios - 使用缓存的 UICollectionViewLayoutAttributes 子类化 UICollectionViewLayout

转载 作者:行者123 更新时间:2023-11-28 13:37:42 29 4
gpt4 key购买 nike

我试图了解 UICollectionViewLayout 的工作原理并找到了这个示例代码。

https://developer.apple.com/documentation/uikit/uicollectionview/customizing_collection_view_layouts

在示例代码(以及我能找到的所有其他示例)中,它具有 cachedLayoutAttributes 对象并在 prepare() 中计算所有项目的布局。

我发现这个模式有 2 个问题。

一个是如果数据源的数量足够多,在prepare()方法中计算所有东西都需要时间(而且每当collectionView的布局发生变化时都会重新计算),所以不会看起来很有效率。

另一个问题是 layoutAttributesForItemlayoutAttributesForSupplementaryView 不可能被调用。只有 layoutAttributesForElements 被调用,似乎足以布局单元格/补充 View 。

我阅读了文档,但它只说必须覆盖这些方法。我最好的猜测是我应该使用覆盖这些方法来返回适当的 UICollectionViewLayoutAttributes 并从 layoutAttributesForElements 调用它们。然而,只要用户滚动 UICollectionView,这个 layoutAttributesForElements 就会被调用,所以它似乎也不是很有效。

我想知道 layoutAttributesForItemlayoutAttributesForSupplementaryView 被调用的情况,什么/何时/何处是计算 的最佳方式/地点/时间UICollectionViewLayoutAttributes 如果数据源数量巨大。

更新

感谢您的评论。然而,它似乎是关于失效周期的优化。

Layout objects that are designed to support invalidation contexts can use the information in a UICollectionViewLayoutInvalidationContext object to optimize their behavior during the invalidation cycle.

这意味着 UICollectionViewLayoutAttributes 已经设置并且只使必要的部分无效,对吧?

那么,第一次应该在哪里计算UICollectionViewLayoutAttributes呢?如果我错了,请告诉我。

最佳答案

One is if the number of data source is big enough, calculating everything in the prepare() method will take time(and it will be recalculated whenever collectionView's layout changes), so it doesn't look very efficient.

是的,看起来效率不高。让 prepare() 计算尽可能高效是您的工作。

例如:只计算一部分属性,当scroll使用shouldInvalidateLayout(forBoundsChange:)改变位置时计算更多属性.但要小心使用此方法,因为它可能会使每个像素滚动上的布局无效。

prepare() 方法不是为了好玩而调用的,它会通知您某些内容已更改并且需要重新计算!但是有关更改的信息很难获得。您可以查看如何 IGListKit在准备之前获取有关更改的信息:link .

The other issue is that there is no chance layoutAttributesForItem or layoutAttributesForSupplementaryView get called. Only layoutAttributesForElements gets called and it seems it is sufficient enough to layout cells/supplementary views.

layoutAttributesForElements(in:) 首先被调用,因为该集合不知道您的单元格和补充 View 的顺序。所以它要求指定矩形中的所有属性。尝试插入/移动/删除/重新加载单元格,我相信 layoutAttributesForItem(at:) 可能会被调用。或者可能不是。但您不必担心,因为您已经拥有属性缓存。

因为你缓存属性 layoutAttributesForElements(in:) 应该足够有效并且看起来像这样:

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
return attributes
.reduce(into: [UICollectionViewLayoutAttributes](), { $0 += $1.filter({ $0.frame.intersects(rect) }) })
}

我个人建议查看一些困难的开源布局。与来自任何简单示例项目的信息相比,您将获得更多关于 UICollectionViewLayout 的信息。

关于ios - 使用缓存的 UICollectionViewLayoutAttributes 子类化 UICollectionViewLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402449/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com