UICollectionViewController + diffableDataSource - 当你的手指还在上面时,单元格不会突出显示

UICollectionViewController + diffableDataSource - cell gets unhighlighted while your finger is still on it

如果我将 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 中它不再被声明为可选的,这就是这个变量导致问题中描述的行为的原因多于。 文档中提供了有关此变量的更多信息: https://developer.apple.com/documentation/uikit/uicollectionviewcontroller/1623979-installsstandardgestureforintera