【问题标题】:Context Menu blocks Drag and Drop into new window上下文菜单块拖放到新窗口
【发布时间】:2020-02-22 13:50:05
【问题描述】:

这款 iPadOS/iOS 13 应用同时实现了多窗口和拖放功能。几乎在所有情况下,两者都能完美运行。

我们在实现 UITableViewDelegate 的上下文菜单方法的表视图中遇到了唯一的问题。

- tableView:contextMenuConfigurationForRowAtIndexPath:point:Beta
- tableView:willPerformPreviewActionForMenuWithConfiguration:animator:Beta

如果我们在上下文菜单出现之前启动拖动,那么我们可以通过将项目移动到屏幕边缘成功地将项目拖动到新窗口(UIScene)中。但是,如果我们在上下文菜单出现后开始拖动,则无法将项目拖动到新窗口或新场景中。

有谁知道问题的根源是什么?

这里有两个对比视频展示了这个问题:

失败

成功

【问题讨论】:

    标签: ios uitableview drag-and-drop ipados uiscene


    【解决方案1】:

    已识别的问题

    viewDidAppear: 中,我们执行了以下操作:

    UISceneActivationConditions *conditions = self.view.window.windowScene.activationConditions;
    conditions.prefersToActivateForTargetContentIdentifierPredicate = [NSPredicate predicateWithFormat:@"self == %@", self.note.noteID];
    conditions.canActivateForTargetContentIdentifierPredicate = [NSPredicate predicateWithFormat:@"self == %@", self.note.noteID];
    

    当显示上下文菜单时,viewDidAppear: 被调用,.activationConditions 被应用到当前 UIScene。

    请注意,上下文菜单的预览视图控制器与拖放项共享 NSUserActivity 详细信息,因此我们尝试拖动的 NSUserActivity 的 .targetContentIdentifier 与当前 UIScene 的 .activationConditions 谓词匹配。因此,当显示上下文菜单的预览视图控制器时,我们告诉系统当前 UIScene 是拖动事件的最佳接收者,从而阻止其他新窗口接收它(至少,这是我的假设)。

    (虽然我不同意这种行为,但这似乎是 iOS 13.1.3 中 UIScene 激活条件的解释方式。)

    解决方案

    为了解决这个问题,我只是在上下文菜单中显示视图控制器时阻止了 .activationConditions 的配置。

    这是一个更新的视频,显示成功拖放,即使显示上下文菜单:

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多