检测iOS 3D Touch偷看时间(没有弹出)

时间:2015-10-24 11:57:37

标签: ios uiviewcontroller 3dtouch

我刚刚开始在我的应用中添加基本的3D Touch功能,并且第一次添加它的尝试进展顺利,看起来相当简单。

我想知道是否有办法发现偷看已经结束,而不是进入流行音乐。

UIViewControllerPreviewingDelegate方法很适合告诉你请求偷看或弹出,但我没有看到一种方式被告知偷看已经结束而没有进入流行音乐。

Peeked ViewController是否有办法知道它现在被偷看并且消失,因为我认为这就足够了。基本上我有一个segue,通常会在进入视图时创建一些东西,如果我查看它就需要撤消,如果用户选择刚刚结束窥视而不会弹出。此刻我似乎无法看到检测这种情况的好方法是能够执行所需的清理。

干杯

2 个答案:

答案 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>