Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从关联菜单中删除UICollectionViewDiffableDataSource项时出现动画故障_Ios_Swift_Diffabledatasource_Nsdiffabledatasourcesnapshot_Uicontextmenuconfiguration - Fatal编程技术网

Ios 从关联菜单中删除UICollectionViewDiffableDataSource项时出现动画故障

Ios 从关联菜单中删除UICollectionViewDiffableDataSource项时出现动画故障,ios,swift,diffabledatasource,nsdiffabledatasourcesnapshot,uicontextmenuconfiguration,Ios,Swift,Diffabledatasource,Nsdiffabledatasourcesnapshot,Uicontextmenuconfiguration,我采用了新的UICollectionViewDiffableDataSource。每次删除项目时,我都会应用数据源快照: var snapshot = NSDiffableDataSourceSnapshot<Int, Item>() snapshot.appendSections([0]) snapshot.appendItems(items) apply(snapshot, animatingDifferences: true) 如果我从上下文菜单外删除该项,动画效果会很好。如

我采用了新的UICollectionViewDiffableDataSource。每次删除项目时,我都会应用数据源快照:

var snapshot = NSDiffableDataSourceSnapshot<Int, Item>()
snapshot.appendSections([0])
snapshot.appendItems(items)
apply(snapshot, animatingDifferences: true)

如果我从上下文菜单外删除该项,动画效果会很好。如果从关联菜单中删除,则一个单元格消失,然后导致下一个单元格闪烁。我怀疑在关闭上下文菜单和运行删除动画之间存在某种冲突。我正在寻找解决这个问题的方法。

编辑:这非常稳定,导致用户界面冻结和其他奇怪的故障,有时对长按没有反应,请不要使用。我希望这个API没有那个小故障,它很烦人。

我也发现了这个丑陋的小毛病,差点放弃,直到我想尝试实现另一个交互API,而不是内置在
UICollectionView
,奇怪的是,动画消失了

首先将交互添加到单元格
contentView

let interaction=UIContextMenuInteraction(委托:self)
cell.contentView.addInteraction(交互)
然后实现委托,大概是在显示单元格的位置,在我的例子中是在
viewController

扩展视图控制器:UIContextMenuInteractionDelegate{
func contextMenuInteraction(u交互:UIContextMenuInteraction,configurationForMenuAtLocation位置:CGPoint)->UIContextMenuConfiguration{
//循环遍历所有可见的细胞,找出我们与之交互的细胞
guard let cell=collectionView.visibleCells.first(其中:{$0.contentView==interaction.view})else{
归零
}
//将其转换为索引XPath
guard let indexPath=collectionView.indexPath(for:cell)else{
归零
}
//继续你的魔法!
}
}
瞧,就是这样,不再有浮华的动画了。
我不知道是否有一些边缘情况会选择错误的单元格或其他奇怪的东西,但这似乎工作得很好。

是否在
deleteItem
之后更新快照?是的,从现有快照中删除或以相同的行为创建新的快照结果您是否解决了此问题?我遇到了一个类似的问题:删除的单元格被当前可见单元格底部的某个内容替换。我观察到两件奇怪的事情:第一,我所有的可见单元格都以某种方式重新加载,第二,错误的布局最终由一个从未知来源调用的LayoutSubView修复。在任何情况下,每个单元单独重新加载的事实都会让人感到非常紧张。我想这就是问题所在。我没有解决它。我确实试过延期,但效果不太好。我测试的一些设备所需的时间超过了那里建议的0.4秒。如此长的延迟对于我的用例来说是不可接受的
func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
    guard let item = dataSource.itemIdentifier(for: indexPath) else {
        return nil
    }

    let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in
        let delete = UIAction(title: "Delete", image: UIImage(systemName: "trash.fill"), attributes: .destructive) { _ in
            self.deleteItem(item)
        }

        return UIMenu(title: "", image: nil, identifier: nil, children: [delete])
    }
    return configuration
}