【问题标题】:How to check if the view controller is in peek mode [3d touch] or full screen mode in iOS如何在 iOS 中检查视图控制器是否处于窥视模式 [3d touch] 或全屏模式
【发布时间】:2015-11-21 04:34:04
【问题描述】:

详细视图控制器支持窥视模式。当我们以 peek 模式显示详细控制器时,我们需要禁用详细控制器的工具提示/教程。我们如何识别视图控制器是以窥视模式还是全屏模式显示?

【问题讨论】:

    标签: ios iphone ios9 3dtouch


    【解决方案1】:

    有一种不完美但实用的方法可以做到这一点。在许多情况下,UINavigationController 和/或UITabBarController 仅用于窥视模式之外。您可以通过此识别窥视模式。

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

    【讨论】:

    • 我最近发现如果你启动交互式弹出手势然后取消它,navigationController 属性变成nil 很难。
    【解决方案2】:

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

    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
    }
    

    然后,在详细视图控制器内部,启用/禁用您需要的任何东西。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以根据屏幕大小检查窥视视图控制器的高度

        override func viewDidLayoutSubviews() {
        
           super.viewDidLayoutSubviews()
        
           let screen = UIScreen.main.bounds
           if view.frame.height == screen.height { 
              // NOT peek mode
           } else {
              // Peek mode
           }
        
        }
        

        【讨论】:

        • 你怎么能确定视图的高度就是屏幕的高度?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 2018-01-28
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多