如何在 iOS 13 中查看和弹出视图控制器

how to peek and pop view controllers in iOS 13

Peek and pop (UIViewControllerPreviewing) 在 iOS 13 中被弃用。它将被新的 contextMenuInteraction 内容替换。

那么如何直接替换peek和pop呢?换句话说,我如何将目标视图控制器显示为预览(peek),然后让用户从那里弹出到实际目标视图控制器的呈现?

这是我正在尝试的方法,但它与旧的 peek and 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 意味着预览 成为 第二个视图控制器。它应该 增长 成为演示文稿 ("pop")。

我尝试将动画师的 preferredCommitStyle 设置为 .pop(如注释掉的行所示),但没有任何区别。

有人解决了吗?

编辑 Apple 自己的应用程序也不能正确执行此操作。在照片应用程序中,如果您长按照片以获取上下文菜单和预览,如果您点击预览,它会被关闭,然后推送的图像会突然出现。此外,如果您随后尝试返回(点击后退按钮),您会崩溃。

这个问题是在 iOS 13 beta 开发的早期阶段提出的。我提交了错误报告。事实证明,我看到的 一个错误,而 Apple 知道这一点。在 iOS 13 beta 开发的后期阶段,实现了正确的 .pop 行为,实际上 是默认值 。因此,它现在的外观和行为就像早期系统中的 peek 和 pop 一样。

所以,在我的问题中,我说:

That's not peek and pop. Peek and pop means the preview becomes the second view controller. It should grow to become the presentation ("pop").

这就是它的作用。错误已修复,问题已解决(我已关闭与 Apple 的错误报告)。