在滚动时应用CollectionView layerMask“jitter”

时间:2017-08-23 14:03:41

标签: ios uicollectionview

我正在研究一个视图控制器原型,它包含一个具有以下要求的collectionView:

  • 可见单个背景图像
  • 与手风琴视图类似的“崩溃”部分
  • 列表中的第一个视图(从现在开始称为“主标题”)“粘贴”到屏幕顶部,因此滚动时底部的按钮仍然可见
  • 当标题停靠在顶部时,标题“粘贴”在主标题下方,并相互推开。这就像tableView中节标题的默认行为一样。
  • 主标题,标题标题和单元格都具有透明背景

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

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

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

  1. 使用CADisplayLink并更新每一帧的图层蒙版。为了确定视图帧何时相交,我尝试了UIView.frame以及UIView.layer.presentation()。frame。
  2. 在我的UICollectionViewFlowLayout子类上使用UICollectionViewLayoutAttributes来计算图层蒙版帧而不是视图本身。
  3. 构建一个自定义UICollectionViewLayout子类并使用其布局属性来计算图层蒙版帧(消除了由于UICollectionViewFlowLayout子类而导致的可能性。)
  4. 我对这种行为有一些理论。也许有一个同步问题,因为collectionView在运行循环的单独传递中更新视图位置,当contentOffset更改时,图层蒙版的帧更改是由于某些隐式动画,或者图层蒙版在放置一半时无法正确渲染点。在一个禁用动作的CATransaction中包装排除了隐式动画问题,虽然我在浏览layer.presentation()时屏蔽帧计算可能已经排除了同步问题,但我可以使用displayLink。

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

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

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

    非常感谢有关此行为发生原因的任何帮助或指示!

1 个答案:

答案 0 :(得分:0)

想出来。解决方案类似于我在测试期间尝试过的方法。

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