如何在iOS 13中使用Peek和Pop查看视图控制器

11

在 iOS 13 中,Peek 和 Pop(UIViewControllerPreviewing)已被弃用。它将被新的 contextMenuInteraction 所替代。

那么我该如何直接替换 Peek 和 Pop 呢?换句话说,我应该如何显示目标视图控制器作为预览 (Peek),然后让用户从那里跳转到实际的目标视图控制器呢?

以下是我正在尝试的内容,但它并不与旧的 Peek 和 Pop 相同:

override func viewDidLoad() {
    super.viewDidLoad()
    let inter = UIContextMenuInteraction(delegate: self)
    self.view.addInteraction(inter)
}

func contextMenuInteraction(_ inter: UIContextMenuInteraction, 
    configurationForMenuAtLocation loc: CGPoint) -> UIContextMenuConfiguration? {
        let config = UIContextMenuConfiguration(identifier: "preview" as NSString, 
            previewProvider: { SecondViewController() }, actionProvider: nil)
        return config
}

func contextMenuInteraction(_ interaction: UIContextMenuInteraction, 
    willCommitWithAnimator animator: UIContextMenuInteractionCommitAnimating) {
        // animator.preferredCommitStyle = .pop
        if let vc = animator.previewViewController {
            animator.addCompletion {
                self.present(vc, animated: true, completion: nil)
            }
        }
}
在这个简单的测试中,第一个视图控制器的整个背景视图成为我们可以长按以查看第二个视图控制器预览的地方。发生的是我们确实看到了预览,用户可以点击它。但是然后预览被取消,然后第二个视图控制器被呈现。
这不是 peek 和 pop。Peek 和 pop 意味着预览变成第二个视图控制器。它应该增长以成为展示("pop")。
我尝试设置动画师的 preferredCommitStyle 为 .pop(如注释掉的行所示),但没有任何区别。
有人解决了吗?
编辑:甚至苹果自己的应用程序也没有做到这一点。在照片应用程序中,如果您长按照片以获取上下文菜单和预览,则如果您点击预览,它将被取消,然后突然出现推送的图像。此外,如果您尝试返回(点击“返回”按钮),则会崩溃。

对于从谷歌搜索“ios 13 peek and pop”而来的其他人,代理中的“commit”函数在测试阶段已被重命名为func contextMenuInteraction(_:willPerformPreviewActionForMenuWith:animator:) - Gereon
这里有一个很好的指南,介绍如何实现它:https://kylebashour.com/posts/ios-13-context-menus - Deitsch
1个回答

10
问题是在iOS 13测试版早期阶段提出的,我提交了一个错误报告。结果发现,我所看到的确实存在一个漏洞,并且苹果公司已经知道了这个问题。在iOS 13测试版开发的后期阶段,正确的 `.pop` 行为被实现了,并且实际上是默认行为。因此,它现在的外观和行为与之前的 peek 和 pop 相同。
因此,在我的问题中,我说:
“那不是peek和pop。Peek and pop意味着预览变成第二个视图控制器。它应该增大并成为展示(‘pop’)。”
现在它正是这样。该漏洞已得到修复,问题已经解决(我已经关闭了向苹果公司的错误报告)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接