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

问题描述 投票:7回答:2

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

我想知道是否有办法检测到一个偷看已经完成,而没有进入流行音乐。

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

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

干杯

ios uiviewcontroller 3dtouch
2个回答
15
投票

当您使用registerForPreviewingWithDelegate()注册预览时,将返回符合UIViewControllerPreviewing协议的上下文。该协议包含对用于窥视/弹出的手势识别器的引用,称为previewingGestureRecognizerForFailureRelationship。它可以在同时识别其他手势识别器时使用,但您也可以将自己的对象添加为目标以观察更改。

现在,当你偷看时,这个手势识别器的状态将是.Changed。释放时不弹出,状态将更改为.Ended。当你弹出时,状态将变为.Cancelled(我实际上预计这是另一种方式,但至少我们可以区分)。重要的是,在调用窥视视图控制器的viewDidDisappear之前,此状态会发生变化,因此您可以及时调整标记。


1
投票

我在我的应用程序中遇到了同样的问题,我需要知道视图控制器何时启动并停止被窥视并提出以下内容。

为了监视窥视的生命周期,您可以跟踪正在查看的视图控制器的生命周期,从在previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController中创建的视图控制器开始,以及以viewDidDisappear()结束。

我在视图控制器中创建了一个回调处理程序,正在查看,PeekingViewController

var viewDidDisappearHandler: (()->())? = nil

并把它放在PeekingViewControllerviewDidDisappear中:

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()
        }
    }
}

注意:如果执行和取消峰值,将触发此逻辑,但如果执行峰值,则完成segue,然后弹出新呈现的PeekingViewController

如果你需要关于被取消的偷看的逻辑只是被一个不完整的偷看触发,而不是一个完整的高峰然后被解雇,你可以通过以下方式实现:

OriginalViewController中包含一个新的布尔值来跟踪一个视图控制器是否被完全推动(OriginalViewControllerviewDidDisappear将在完全推动时触发,但不是在偷看),并在peekingViewControllerdidSet中检查该布尔值,以确定是否应该采取任何动作,以及在peekingViewControllerOriginalViewController中将viewWillAppear设置为nil。

© www.soinside.com 2019 - 2024. All rights reserved.