然而,我在想是否有一种方法可以检测到峰值已经完成,而没有进入弹出窗口。
UIViewControllerPreviewingDelegate方法可以告诉您请求峰值或弹出窗口,但我没有看到一种方法可以告诉您峰值已经结束并且没有进入弹出窗口。
峰值视图控制器是否有一种方式知道它目前处于峰值并且正在消失,因为我猜这就足够了。基本上,我有一个转场通常会在进入视图时创建一些东西,如果我窥视它,则需要撤消用户选择仅结束窥视而不弹出的内容。目前,我似乎无法找到检测此情况以执行所需清理的好方法。
干杯
当您使用registerForPreviewingWithDelegate()
注册预览时,会返回一个符合UIViewControllerPreviewing
协议的上下文。该协议包含一个引用被用于浏览/弹出的手势识别器,称为previewingGestureRecognizerForFailureRelationship
。它被设计用来在其他手势识别器可能同时被识别时使用,但您也可以将自己的对象添加为目标来观察更改。
现在,在进行浏览时,此手势识别器的状态将为.Changed
。当您在不弹出的情况下释放时,状态将变为.Ended
。当您弹出时,状态将变为.Cancelled
(我实际上期望这是相反的,但至少我们可以区分)。重要的是,在调用您查看的视图控制器的viewDidDisappear
之前,此状态会发生变化,因此您可以及时调整标志。
我在我的应用程序中遇到了同样的问题,我需要知道一个视图控制器何时开始和停止被窥视,并得出以下结论。
为了监控预览的生命周期,您可以跟踪被窥视的视图控制器的生命周期,从在 previewingContext(_ previewingContext:UIViewControllerPreviewing,viewControllerForLocation location:CGPoint) -> UIViewController
中创建视图控制器开始,到其 viewDidDisappear()
结束。
我在被窥视的视图控制器 PeekingViewController
中创建了回调处理程序:
var viewDidDisappearHandler:(() - >())?= nil
并将其放置在 PeekingViewController
的 viewDidDisappear
中:
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
viewDidDisappearHandler?()
}
OriginalViewcontroller
中,我们正在查看PeekingViewController
,需要保留对被查看视图控制器实例的弱引用,如下所示:weak var peekingViewController: PeekingViewController?
。func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
self.peekingViewController = PeekingViewController()
return peekingViewController
}
peekingViewController
实例中填写didSet来观察对被窥视的视图控制器的弱引用的更改:weak private var peekingViewController: PeekingViewController? {
didSet {
peekingViewController?.viewDidDisappearHandler = { [weak self] in
self?.peekingViewController = nil
}
if peekingViewController == nil { // Peek ended
handlePeekEnded()
} else { // Peek began
handlePeekBegan()
}
}
}