gpt4 book ai didi

ios - 滚动时应用 CollectionView layerMask "jitter"

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

我正在开发一个 View Controller 原型(prototype),该原型(prototype)由具有以下要求的 collectionView 组成:

  • 有一张背景图片可见
  • 部分可以像 Accordion View 一样“折叠”
  • 列表中的第一个 View (从现在起称为“主标题”)“粘”在屏幕顶部,因此底部的按钮在滚动时仍然可见
  • 节标题“粘”在主标题下方,并在下一个节标题停靠在顶部时将彼此推开。这就像 tableView 中节标题的默认行为。
  • 主标题、节标题和单元格都具有透明背景

我决定使用 UICollectionView 作为我的解决方案。我本可以尝试解决 UITableView 问题,但我希望在折叠和展开部分时更好地控制动画。它还允许我通过对 UICollectionViewFlowLayout 进行子类化来更细粒度地控制 View 在屏幕上的位置。

透明度要求存在问题。因为所有 View 都有清晰的背景,所以当发生重叠时(由于粘性的主标题和节标题)我们可以立即看到所有单元格,理想情况下,单元格应该在它们的节标题“下方”。我的解决方案是找到重叠 View 之间的帧差异,并使用图层蒙版“隐藏”重叠 View 的部分,如果背景不透明,通常会隐藏这些部分。

出于某种原因,在滚动时,图层蒙版的框架似乎没有与 scrollView 的 contentOffset 同时更新,导致轻微但明显的“延迟”。我尝试了以下方法来解决这个问题(所有方法都表现出相同的行为):

  1. 使用 CADisplayLink 并在每一帧更新图层蒙版。为了确定 View 框架何时相交,我尝试了 UIView.frame 和 UIView.layer.presentation().frame。
  2. 在我的 UICollectionViewFlowLayout 子类上使用 UICollectionViewLayoutAttributes 来计算图层蒙版帧而不是 View 本身。
  3. 构建一个自定义的 UICollectionViewLayout 子类并使用其布局属性来计算图层蒙版帧(消除它是由于 UICollectionViewFlowLayout 子类的原因的可能性)。

对于这种行为,我有一些理论。可能存在同步问题,因为 collectionView 在 contentOffset 更改时在运行循环的单独 channel 中更新 View 位置,图层蒙版的帧更改是由于某些隐式动画,或者图层蒙版在放置在一半时无法正确呈现 -点。包裹在禁用 Action 的 CATransaction 中排除了隐式动画问题,我会在读取 layer.presentation() 时通过 displayLink 进行 mask 帧计算,这将排除同步问题。

其他有趣的注意事项,使用 UITableView 时不会发生此行为,这就是为什么我认为它可能与运行循环有关。

下面是我的 github 页面上示例项目的链接,该示例项目说明了上面讨论的行为。此示例中的单元格默认设置了背景颜色,以更好地说明问题(当它们透明时很难看清)。

https://github.com/irtemed88/ScrollJitterTest-iOS

任何关于为什么会发生这种行为的帮助或指示将不胜感激!

最佳答案

想通了。该解决方案类似于我在测试期间尝试过的方法。

该问题似乎与运行循环有关(或者至少在更新 ScrollView 的内容偏移量时)。我没有根据 Collection View 中的 View 计算图层蒙版框架,而是为每个项目使用自定义 UICollectionViewLayout 和相应的 UICollectionViewLayoutAttributes 来计算蒙版框架。布局属性似乎与屏幕上 View 的重新定位同步更新。在设置掩码时关闭这些值可以解决问题。

关于ios - 滚动时应用 CollectionView layerMask "jitter",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841967/

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