gpt4 book ai didi

ios - 插入多个自定义补充 View 时的流布局动画故障

转载 作者:IT王子 更新时间:2023-10-29 05:06:15 24 4
gpt4 key购买 nike

当使用现有的补充 View 在集合 View 中插入多个自定义补充 View 时,使用 UICollectionViewFlowLayout 的子类,集合 View 似乎会创建故障动画或无法正确处理插入。

插入一个补充 View 的行为符合预期,但一次插入两个补充 View 会导致明显的视觉故障,并且一次插入许多补充 View (例如 4+)会使故障恶化。 (iOS 10.2、iOS 9.3、Swift 3、Xcode 8.2.1)

这是一个演示:

Animation showing two items and two supplementary views being inserted into a collection view with a simple flow layout.

您可以使用 this sample project 重现该问题。在这个简化的示例中,每个项目有一个补充 View ,并且在每次批量更新期间插入两个项目(具有两个补充 View )。在我的实际项目中,我的补充 View 少于项目,并且我利用了其他流布局功能。

我最好的猜测是某些东西导致集合 View 混淆了对应于现有/插入的补充 View 的索引路径或布局属性。如果这被证明是 Apple 类(class)中的一个错误,我将非常感谢您提供最优雅的解决方法。

尝试的解决方案

我已经尝试并仔细检查了以下每一项:

  • 实现 indexPathsToInsertForSupplementaryView(ofKind:) ——据我所知,这很简单,我的实现返回了正确的索引路径。始终插入 View 。对于补充页眉和页脚 View , UICollectionViewFlowLayout 似乎返回一个排序的索引路径数组,但对数组进行排序对我没有任何影响。
  • 提供初始和最终布局属性 — 为这些方法调用 super 似乎返回正确的帧,因此不清楚可以对初始或最终布局属性进行哪些调整(如果有)来解决问题。但请参阅下面提到的第三个好奇心。
  • 使布局无效 — 布局是在 performBatchUpdates() 之前、期间或之后全部或部分手动无效,还是完全无效,这似乎没有任何区别。
  • 自定义索引路径 —尽管补充元素的索引路径不需要对应项目索引路径,据我所知,尽管文档相反,UICollectionViewFlowLayout 将崩溃(通过请求不存在索引的布局属性路径),除非相同类型的补充元素从 0 开始按顺序编号。我假设这是在插入或删除元素时集合 View 和/或布局对象能够计算新索引路径的方式(即通过增加或减少 item索引路径的属性)。因此构建任意索引路径不是一种选择。

  • 调试时注意到的好奇心
  • 视觉故障特定于补充 View ,不会发生在插入的项目中,即使两者的索引路径和框架相同。
  • 调试 View 层次发现,虽然插入的补充 View 的帧是正确的,但一些现有的补充 View 的帧是不正确的。尽管布局对象为那些索引路径上的现有 View 返回的帧看起来是正确的,但情况仍然如此。
  • 插入多个补充 View 时,集合 View 对初始和最终布局属性的调用似乎不平衡。即对同一个索引路径多次请求初始布局属性(自然每次都返回相同的属性),对最终布局属性的请求较少。此外,对于一些现有的补充 View ,根本不需要初始和最终布局属性。我觉得这很可疑。这让我相信集合 View 在某种程度上混淆了更新前后的补充 View 和/或索引路径。
  • 我的 Swift 代码创建的 IndexPath 实例的内存地址与 UICollectionView 和 UICollectionViewFlowLayout 在内部创建的 NSIndexPath 实例截然不同。前者总是不同的(正如预期的那样),而后者在发布之间似乎是相同的(例如 [0, 0], [0, 1] 和 [0, 2] 总是在 0xc000000000000016 , 0xc0000000002000160xc000000000400016 )。在 Swift 中,IndexPath 桥接到 NSIndexPath,但是 the former is a value type whereas the latter is a reference type 。 NSIndexPath 也是 uses tagged pointers 。两者之间存在不完全桥接和/或集合 View 类以某种方式在内部依赖 NSIndexPath 行为的可能性很小,这会导致此处明显的索引路径混淆。我不知道如何对此进行测试或进一步研究。

  • 类似问题

    以下问题可能是相关的,但没有一个答案对我有用:
  • How can UICollectionView supplementary views be inserted or deleted correctly
  • layoutAttributesForSupplementaryViewOfKind:atIndexPath: passes in incorrect indexPath
  • UICollectionView supplementary views won't animate “in” or “out”
  • UICollectionView Decoration and Supplementary views can not be moved

  • 该问题也可能与 Open Radar 上的 this bug report 相关。该报告随附的示例项目有点复杂,但没有多大用处。

    苹果技术支持

    发布此问题后,我向 Apple 提交了技术支持事件。 Apple Developer Support 回复如下:

    Our engineers have reviewed your request and have determined that this would be best handled as a bug report.

    Please submit a complete bug report regarding this issue using the Bug Reporting tool at https://developer.apple.com/bug-reporting/.

    ...

    We’ve spent some time investigating the possibility of a workaround and unfortunately have come up empty handed. Please follow up with your bug. If we find the possibility of some kind of workaround in the future, we will reach out. Sorry I don’t have better news.



    如果您遇到此问题,请复制 rdar://30510010

    最佳答案

    以下是 CustomCollectionViewController 的输出文件 indexPath 项目行 适用于 cellForItemAt indexPath行补充适用于 viewForSupplementaryElementOfKind .

    enter image description here

    如您所见 cellForItemAt正在正确返回 indexpath.item但在 viewForSupplementaryElementOfKind没有返回预期的答案。我到现在还没弄明白原因,如果我得到我会尽快更新你。

    因此,对于重新解决,您可以通过在数组中添加新数据并重新加载 collectionView 而不是 indexPath 来处理数组。

    关于ios - 插入多个自定义补充 View 时的流布局动画故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41820776/

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