上下文菜单块拖放到新 window
Context Menu blocks Drag and Drop into new window
这个 iPadOS/iOS 13 应用程序实现了多个 windows 和拖放。在几乎所有情况下,两者都能完美运行。
我们在实现 UITableViewDelegate 的上下文菜单方法的 table 视图中遇到了唯一的问题。
- tableView:contextMenuConfigurationForRowAtIndexPath:point:Beta
- tableView:willPerformPreviewActionForMenuWithConfiguration:animator:Beta
如果我们在出现上下文菜单之前开始拖动,那么我们可以通过将项目移动到边缘来成功地将项目拖动到新的window(UIScene)中的屏幕。但是,如果我们在 出现上下文菜单后 开始拖动,则无法将项目拖动到新的 window 或场景中。
有谁知道问题的根源是什么?
这里有两个对比鲜明的视频展示了这个问题:
失败
成功
确定的问题
在 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
与 .activationConditions
谓词匹配当前的 UIScene。因此,当显示上下文菜单的预览视图控制器时,我们告诉系统当前的 UIScene 是拖动事件的最佳接收者,阻止其他新的 windows 接收它(至少,这是我的假设)。
(虽然我不同意这种行为,但在 iOS 13.1.3 中似乎是如何解释 UIScene 激活条件的。)
解决方案
为了修复它,我只是在上下文菜单中显示视图控制器时阻止了 .activationConditions
的配置。
这是一个 更新的视频 显示成功的拖放,即使显示上下文菜单也是如此:
这个 iPadOS/iOS 13 应用程序实现了多个 windows 和拖放。在几乎所有情况下,两者都能完美运行。
我们在实现 UITableViewDelegate 的上下文菜单方法的 table 视图中遇到了唯一的问题。
- tableView:contextMenuConfigurationForRowAtIndexPath:point:Beta
- tableView:willPerformPreviewActionForMenuWithConfiguration:animator:Beta
如果我们在出现上下文菜单之前开始拖动,那么我们可以通过将项目移动到边缘来成功地将项目拖动到新的window(UIScene)中的屏幕。但是,如果我们在 出现上下文菜单后 开始拖动,则无法将项目拖动到新的 window 或场景中。
有谁知道问题的根源是什么?
这里有两个对比鲜明的视频展示了这个问题:
失败
成功
确定的问题
在 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
与 .activationConditions
谓词匹配当前的 UIScene。因此,当显示上下文菜单的预览视图控制器时,我们告诉系统当前的 UIScene 是拖动事件的最佳接收者,阻止其他新的 windows 接收它(至少,这是我的假设)。
(虽然我不同意这种行为,但在 iOS 13.1.3 中似乎是如何解释 UIScene 激活条件的。)
解决方案
为了修复它,我只是在上下文菜单中显示视图控制器时阻止了 .activationConditions
的配置。
这是一个 更新的视频 显示成功的拖放,即使显示上下文菜单也是如此: