我刚刚开始在我的应用中添加基本的3D Touch功能,并且第一次添加它的尝试进展顺利,看起来相当简单。
我想知道是否有办法发现偷看已经结束,而不是进入流行音乐。
UIViewControllerPreviewingDelegate方法很适合告诉你请求偷看或弹出,但我没有看到一种方式被告知偷看已经结束而没有进入流行音乐。
Peeked ViewController是否有办法知道它现在被偷看并且消失,因为我认为这就足够了。基本上我有一个segue,通常会在进入视图时创建一些东西,如果我查看它就需要撤消,如果用户选择刚刚结束窥视而不会弹出。此刻我似乎无法看到检测这种情况的好方法是能够执行所需的清理。
干杯
答案 0 :(得分:15)
当您使用registerForPreviewingWithDelegate()
注册预览时,将返回符合UIViewControllerPreviewing
协议的上下文。该协议包含对用于窥视/弹出的手势识别器的引用,称为previewingGestureRecognizerForFailureRelationship
。它可以在同时识别其他手势识别器时使用,但您也可以将自己的对象添加为目标以观察更改。
现在,当你偷看时,这个手势识别器的状态将为.Changed
。释放时不弹出,状态将更改为.Ended
。当你弹出时,状态将变为.Cancelled
(我实际上预计这是另一种方式,但至少我们可以区分它们)。重要的是,此状态会在之前更改调用您的peeked视图控制器的viewDidDisappear
,因此您可以及时调整您的标记。
答案 1 :(得分:1)
我的应用程序中遇到了同样的问题,我需要知道何时启动和停止查看控制器,并提出以下建议。
为了监视监视的生命周期,您可以跟踪正在监视的视图控制器的生命周期,从previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController
中创建的视图控制器开始,到其viewDidDisappear()
结束。
我在视图控制器PeekingViewController
中创建了一个回调处理程序,
var viewDidDisappearHandler: (()->())? = nil
并按如下所示放置在PeekingViewController
的{{1}}中:
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
}
实例中填充didSet来观察到对正在偷看的视图控制器的弱引用的更改,如下所示:
peekingViewController
注意:
如果执行并取消了一个峰,则将触发此逻辑,但是如果执行了一个峰,则segue完成,然后弹出新显示的weak private var peekingViewController: PeekingViewController? {
didSet {
peekingViewController?.viewDidDisappearHandler = { [weak self] in
self?.peekingViewController = nil
}
if peekingViewController == nil { // Peek ended
handlePeekEnded()
} else { // Peek began
handlePeekBegan()
}
}
}
。
如果您需要有关不完整的窥视(而不是整个高峰然后被解雇)触发以仅 取消窥视的逻辑,则可以通过以下方式实现此目的:
在PeekingViewController
中包含一个新的布尔值,以跟踪视图控制器是否被完全按下({OriginalViewController
的{{1}}将在完全按下时触发,但不会立即窥视),并且检查OriginalViewController
的{{1}}中的布尔值,以确定是否应采取任何措施,并将viewDidDisappear
的{{1}}中的peekingViewController
设置为nil。 / p>