UICollectionView在每个部分显示滚动指示器(标题zIndex损坏)

7
当我滚动我的UICollectionView时,会显示多个滚动指示器。我注意到每个部分都有一个指示器。如下图所示,同时显示三个:

enter image description here

有人遇到过同样的问题吗?我正在使用Xcode 9 beta 3。我的collectionview设置非常常见:

private let formCollectionView: UICollectionView = {
        let collectionViewLayout = UICollectionViewFlowLayout()
        collectionViewLayout.minimumLineSpacing = 0
        collectionViewLayout.minimumInteritemSpacing = 0
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.backgroundColor = UIColor.clear
        return collectionView
}()

编辑于2017年10月16日

连Twitter似乎也出现了这个问题:

输入图像描述


1
很奇怪。从截图看不太清楚,它们真的是滚动指示器,而不仅仅是其他视图被裁剪了吗? - NRitH
1
它们绝对是滚动指示器,因为我可以通过将 showsVerticalScrollIndicator 设置为 false 来摆脱它们。当我滚动时,它们会出现并减小高度,直到消失。不,我没有吸食任何大麻。 - Viktor Kucera
没有更新吗?这是发生在“所有”iOS版本上吗? - swalkner
据我所知,这只是最新的iOS 11问题。 - Viktor Kucera
1
页脚/页眉视图似乎重叠在滚动条上,而滚动条的zPosition似乎比节头/节尾低。 - strangetimes
4个回答

27

您可以通过委托方法来解决此问题,例如以下示例:

Objective-C

- (void)collectionView:(UICollectionView *)collectionView willDisplaySupplementaryView:(UICollectionReusableView *)view forElementKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
    {
        if (@available(iOS 11.0, *)) {
            if ([elementKind isEqualToString:UICollectionElementKindSectionHeader]) {
                view.layer.zPosition = 0;
            }
        }
    }

迅速的

func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {
    if elementKind == UICollectionView.elementKindSectionHeader {
        view.layer.zPosition = 0
    }
}

这个解决方案似乎比其他方案更加稳定。 - Jerry
这与一致性无关,实际上这是正确的集合。那些不是多个滚动条,而是同一个滚动条被一个部分头视图覆盖,该视图似乎具有比其余子视图更高的zPosition,但比滚动条指示器低。在上面的截屏中,滚动条被不透明的标题视图覆盖,使其看起来像有多个滚动条指示器。 - strangetimes

3

首先,已经有一个问题报告

有一个提议的解决方法。我在我的UICollectionReusableView子类中部分成功地完成了这个垃圾操作。

override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
    super.apply(layoutAttributes)
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
        self.layer.zPosition = 0
    }
}

我这么说部分原因是,如果你的UICollectionView稍微长一点,有些表头仍然会出现错误。尽管大多数情况下都没问题,但这取决于你的情况。希望这个问题很快就能解决。


有一个可靠的解决方法 - Viktor Kucera

1

这不是多个滚动指示器。标题视图的 z 索引高于滚动指示器视图。

编辑:发现了更有趣的事情,如果运行视图调试器,则滚动指示器位于标题上方... 有些奇怪。


有趣。因为我在我的collectionview中也有一个bug,当编辑(重新排序/拖放)单元格时,头视图会覆盖拖动的单元格。虽然我没有设置zIndex,但我没有使用自定义布局,只是使用referenceSizeForHeaderInSectionsizeForItemAt来适应设备方向。在iOS 10中一切都正常工作。你也遇到过这个bug吗?你有什么提示如何修复吗? - Viktor Kucera
刚刚发现了相关的 radar。不过尝试了提出的解决方法,没有成功。 - Viktor Kucera

0

有一个简单的方法来解决这个问题。在你的section header view类中,你可以重写layoutSubviews方法,并编写以下代码:

- (void)layoutSubviews {
    [super layoutSubviews];
    self.layer.zPosition = 0;
}

因为,在iOS11之前,分区视图的层zPosition的默认值是0,但在iOS11中,这个默认值变成了1。


对我来说,它仍然是破的。不是所有的头文件,但有一些。修复速率似乎与已经提出的apply(_:)覆盖非常相似:( - Viktor Kucera
也许你应该使用“Debug View Hierarchy”或“Reveal”来检查节头视图层的zPosition是否实际上被设置为0。 - Jack Ma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接