在 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(如注释掉的行所示),但没有任何区别。
有人解决了吗?
编辑:甚至苹果自己的应用程序也没有做到这一点。在照片应用程序中,如果您长按照片以获取上下文菜单和预览,则如果您点击预览,它将被取消,然后突然出现推送的图像。此外,如果您尝试返回(点击“返回”按钮),则会崩溃。
func contextMenuInteraction(_:willPerformPreviewActionForMenuWith:animator:)
。 - Gereon