如何在 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
详细视图控制器支持查看模式。当我们在 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