【发布时间】:2015-11-21 04:34:04
【问题描述】:
详细视图控制器支持窥视模式。当我们以 peek 模式显示详细控制器时,我们需要禁用详细控制器的工具提示/教程。我们如何识别视图控制器是以窥视模式还是全屏模式显示?
【问题讨论】:
详细视图控制器支持窥视模式。当我们以 peek 模式显示详细控制器时,我们需要禁用详细控制器的工具提示/教程。我们如何识别视图控制器是以窥视模式还是全屏模式显示?
【问题讨论】:
有一种不完美但实用的方法可以做到这一点。在许多情况下,UINavigationController 和/或UITabBarController 仅用于窥视模式之外。您可以通过此识别窥视模式。
let isPeeking = navigationController == nil
// or
let isPeeking = tabBarController == nil
【讨论】:
navigationController 属性变成nil 很难。
当您在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
}
然后,在详细视图控制器内部,启用/禁用您需要的任何东西。
【讨论】:
没有直接的方法来确定这一点,但是当您在方法 func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? 中设置窥视 preferredContentSize 时,您可以为视图的宽度设置观察者。
然后参考您的视图控制器的宽度。如果它与您的 preferredContentSize 相同(或小于 UIScreen 宽度),则它处于 peek 模式,否则它已弹出。
【讨论】:
您可以根据屏幕大小检查窥视视图控制器的高度
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let screen = UIScreen.main.bounds
if view.frame.height == screen.height {
// NOT peek mode
} else {
// Peek mode
}
}
【讨论】: