如何在 iOS 中检查视图控制器是处于窥视模式 [3d touch] 还是全屏模式

How to check if the view controller is in peek mode [3d touch] or full screen mode in iOS

详细视图控制器支持查看模式。当我们在 peek 模式下显示详细控制器时,我们需要禁用详细控制器中的 tooltips/tutorial。我们如何确定视图控制器是以查看模式还是全屏模式显示的?

没有直接的方法可以确定这一点,但是当您在方法 func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? 中设置 peek preferredContentSize 时,您可以为视图的宽度设置观察者。

然后参考您的视图控制器的宽度。如果它与您的 preferredContentSize 相同(或小于 UIScreen 宽度),则它处于 peek 模式,否则它已弹出。

当您在 UIViewControllerPreviewing 委托方法中实例化您的视图控制器时,您可以设置一个变量来告诉它它是什么上下文 in.Then 在您的视图控制器代码中做出相应的响应。

public func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
    //...

    let sb = UIStoryboard(name: "DocumentViewer", bundle: nil)
    guard let detailViewController = 
        sb.instantiateViewControllerWithIdentifier("DocumentViewerViewController") 
        as? DocumentViewerViewController else { return nil }

    detailViewController.isPeeking = true // <--- Set variable here

    // Other stuff here...

    detailViewController.preferredContentSize = CGSize(width: 0.0, height: 380.0)
    previewingContext.sourceRect = cell.frame

    return detailViewController
}

然后,在细节视图控制器中,enable/disable任何你需要的东西。

您可以使用屏幕尺寸检查您的 peeking view controller 的高度

override func viewDidLayoutSubviews() {

   super.viewDidLayoutSubviews()

   let screen = UIScreen.main.bounds
   if view.frame.height == screen.height { 
      // NOT peek mode
   } else {
      // Peek mode
   }

}

有一种不完美但实用的方法可以做到这一点。在许多情况下 UINavigationController and/or UITabBarController 仅用于 peek 模式。你可以通过这个识别peek模式。

let isPeeking = navigationController == nil
// or
let isPeeking = tabBarController == nil