UICollectionViewController + diffableDataSource-当手指仍在其上时,单元格未突出显示

问题描述

如果我将UICollectionViewControllerdiffableDataSource一起使用并点击单元格-它会突出显示,但是当我仍然用手指按住它时,它会变得不突出显示。 如果将UIViewController + collectionViewdiffableDataSource一起使用-则一切按预期运行,并且单元格一直突出显示,直到我松开手指为止。如果将UICollectionViewController与标准dataSource一起使用,则效果相同-一切正常。 有没有人注意到这个问题?任何建议或想法都将不胜感激,也许我只是想念一些东西,但现在感觉更像是苹果方面的错误

您可以在此处查看示例: https://github.com/ashishbl86/MockAppStore/blob/0ea8e74a4823c8c80bd7e8d5c6a9514958fbe459/MockAppStore/CollectionViewController.swift

只需将以下方法添加到CollectionViewController.swift文件中即可:

override func collectionView(_ collectionView: UICollectionView,didHighlightItemAt indexPath: IndexPath) {
        print("cell highlighted")
    }
    
    override func collectionView(_ collectionView: UICollectionView,didUnhighlightItemAt indexPath: IndexPath) {
        print("cell unhighlighted")
    } 

您会看到当手指仍在单元格上时,“单元格未突出显示”的打印内容

解决方法

好吧,事实证明我们需要设置

installsStandardGestureForInteractiveMovement = false

此变量为UICollectionViewController安装了标准手势识别器,以驱动重新排序过程。 默认情况下将其设置为true,但是为了使工作正常,collectionView dataSource必须通过实现适当的方法声明其对项目重新排序的支持。 在旧的dataSource方法中,moveItemAt被标记为可选,而在diffableDataSource中,该方法不再被标记为可选,这就是此变量导致问题中所述行为的原因。以上。 有关此变量的更多信息,可在docs中找到: https://developer.apple.com/documentation/uikit/uicollectionviewcontroller/1623979-installsstandardgestureforintera