- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 UICollectionViewLayout
的工作原理并找到了这个示例代码。
https://developer.apple.com/documentation/uikit/uicollectionview/customizing_collection_view_layouts
在示例代码(以及我能找到的所有其他示例)中,它具有 cachedLayoutAttributes
对象并在 prepare()
中计算所有项目的布局。
我发现这个模式有 2 个问题。
一个是如果数据源的数量足够多,在prepare()
方法中计算所有东西都需要时间(而且每当collectionView的布局发生变化时都会重新计算),所以不会看起来很有效率。
另一个问题是 layoutAttributesForItem
或 layoutAttributesForSupplementaryView
不可能被调用。只有 layoutAttributesForElements
被调用,似乎足以布局单元格/补充 View 。
我阅读了文档,但它只说必须覆盖这些方法。我最好的猜测是我应该使用覆盖这些方法来返回适当的 UICollectionViewLayoutAttributes
并从 layoutAttributesForElements
调用它们。然而,只要用户滚动 UICollectionView,这个 layoutAttributesForElements
就会被调用,所以它似乎也不是很有效。
我想知道 layoutAttributesForItem
和 layoutAttributesForSupplementaryView
被调用的情况,什么/何时/何处是计算 的最佳方式/地点/时间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
orlayoutAttributesForSupplementaryView
get called. OnlylayoutAttributesForElements
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/
我关注了这个 Custom Collection View Layout tutorial从 raywenderlich.com 使用 xcode 8 和 swift 3。 当我在实现教程中要求的所有
假设您有一个带有普通自定义 UICollectionViewLayout 的 UICollectionView。 就是这样 >>> 不是 UICollectionViewLayoutAttribut
谁能指出我如何使用 UICollectionViewLayout 创建类似于 Pinterest 列布局的界面的正确方向? 我尝试在网上搜索,但似乎还没有很多例子。 最佳答案 1000memories
我正在尝试配置 Collection View 以在附图中显示以下自定义布局: 。本质上,我希望能够配置我的 Collection View ,使其看起来基于行而不是列。例如: 第 1 行:3 个大小
在UICollectionView中做这样的UICollectionViewLayout是真的吗?请给我一些想法,我该怎么做? 最佳答案 您可以使用 iCarousel ,用于此目的的第三方自定义控件
当我在没有自定义布局对象的情况下实现 UICollectionView 时,所有 16 个可重用单元格都会出现。也就是说,我有 1 个部分,该部分中有 16 个项目。当我创建自定义布局对象时,仅显示
我目前正在使用完全用 Swift 编码的 TreeMap 框架布局:https://github.com/yahoo/YMTreeMap 我创建了自己的 Layout 类,以便像这样自定义单元格: i
正如标题所说,我需要一个 uicollectionview,它能够如图所示在两个方向上分页。 每个方 block 都是ios屏幕,箭头表示允许分页的地方。 UICollectionViewFlowLa
我有两个单元格尺寸小(间距和插入前大约一半屏幕宽度)和大(插入前全屏宽度),这两种尺寸可以在下图中看到。 我希望 UICollectionView 根据给定的大小属性自动调整这些单元格的大小。我已经设
我正在尝试以编程方式设置 UICollectionViewLayout。我正在使用 UICollectionView,也没有使用 Storyboard,也没有设置其约束。 我关注了Ray Wender
我正在使用 UICollectionView 并尝试使用 UICollectionViewLayout 方法来调整单元格的大小,但它们从未被调用过。这些方法是: sizeForItemAtIndexP
我需要准备一个像 IOS spring board 这样的布局,即水平滚动的网格,启用分页,最重要的是单元格应该按行而不是按列排列(在第二张图片中)。我尝试使用 UICollectionViewFlo
我想从数据源中获取所有数据——包括可见的和不可见的单元格——以便计算可见单元格的属性。 collectionView:cellForItemAtIndexPath: 不起作用,因为它为不可见的单元格返
我正在尝试转换以下内容,但不断出现以下错误。 我正在尝试实现以下的 objective c 版本,效果很好: LSSwipeToDeleteCollectionViewLayout 是 UIColle
我已经实现了我自己的从 UICollectionViewLayout 子类化的集合 View 布局。在 prepare我计算和缓存布局属性。 在 layoutAttributesForElements
请帮我解决这个问题,我正在关注这个tutorial要制作自定义 UICollectionViewLayout,用户可以水平滑动以浏览各个部分,垂直滑动以显示项目。 我的问题是,我只希望用户在 UICo
我正在制作一个自定义 UICollectionViewLayout 类进行练习,本质上是尝试重现单元格无限水平布局的水平流布局。 一切都与我的 prepare() 和 layoutAttributes
我对 UICollectionViewLayout 进行了子类化以创建日历。我想让用户能够更改一些设置,例如屏幕上显示的天数(默认为 7)。 我将daysToShow保存在UserDefaults中。
我想使用具有自定义布局的 UICollectionView,其中集合的部分水平滚动,部分中的项目垂直滚动。 目前,我正在使用 UICollectionView,然后使用具有自己的 Collection
我正在将我的应用程序从 Obj-C 转换为 Swift。 我有 UICollectionViewLayout 的子类,它覆盖了已重命名为“prepare”的“prepareForLayout”。到目前
我是一名优秀的程序员,十分优秀!