检测应用程序是否在iOS 9中的"幻灯片放映"或"拆分视图"模式下运行

Mat*_*nen 36 multitasking ipad ios ios9

在iOS 9中,是否可以检测应用程序何时在iOS 9的"幻灯片放映"或"拆分视图"模式下运行?

我已经尝试通过Apple的iOS 9多任务处理文档阅读,但是没有运气好...

我问,因为我的应用程序中可能有一个功能,我想在幻灯片中打开应用程序时禁用该功能.

Tam*_*ola 34

只需检查您的窗口是否占据整个屏幕:

BOOL isRunningInFullScreen = CGRectEqualToRect([UIApplication sharedApplication].delegate.window.frame, [UIApplication sharedApplication].delegate.window.screen.bounds);
Run Code Online (Sandbox Code Playgroud)

如果这是错误的,那么您将在拆分视图或幻灯片中运行.

这是剪切的代码,它将自动保持此标志而不管旋转

-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
 // simply create a property of 'BOOL' type
 isRunningInFullScreen = CGRectEqualToRect([UIApplication sharedApplication].delegate.window.frame, [UIApplication sharedApplication].delegate.window.screen.bounds);
}
Run Code Online (Sandbox Code Playgroud)

  • @cleardemon我用测试应用程序检查了它,在你的具体例子中,它确实首先用全屏窗口调用`applicationDidBecomeActive:`,然后在根视图控制器上调用`viewWillTransitionToSize:`和slideover大小,然后调用`setFrame:`在视窗大小的窗口上.所以我建议覆盖根VC上的`viewWillTransitionToSize:`或窗口的`setFrame:`并对适当传入的大小做出反应.请注意,在其他情况下,窗口框架已在`applicationDidBecomeActive:`... Strange中正确设置. (4认同)
  • 我刚才尝试过,并不总能得到正确的结果.具体在这种情况下:启动应用程序,按home,打开Safari,从右边滑动打开拆分视图,选择我的应用程序.`window.frame`仍显示为1024x768,因此不会被视为处于拆分视图中... (2认同)

Dan*_*ark 17

只是另一种重新包装所有这些的方法

extension UIApplication {
    public var isSplitOrSlideOver: Bool {
        guard let w = self.delegate?.window, let window = w else { return false }
        return !window.frame.equalTo(window.screen.bounds)
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你可以

  • UIApplication.shared.isSplitOrSlideOver 在斯威夫特
  • UIApplication.sharedApplication.isSplitOrSlideOver 在Objective-C中

请注意,在Swift中,window对象是双重可选... WTF!

  • Upvoted 但不得不花费很长时间将其转换为 Obj-c。当我最终被迫转向 Swift 时,这种代码让我感到害怕。 (2认同)

小智 10

我迟到了,但是如果你想要一个独立于方向工作的房产,试试这个:

extension UIApplication 
{
    func isRunningInFullScreen() -> Bool
    {
        if let w = self.keyWindow
        {
            let maxScreenSize = max(UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height)
            let minScreenSize = min(UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height)
            let maxAppSize = max(w.bounds.size.width, w.bounds.size.height)
            let minAppSize = min(w.bounds.size.width, w.bounds.size.height)
            return maxScreenSize == maxAppSize && minScreenSize == minAppSize
        }

        return true
    }
}
Run Code Online (Sandbox Code Playgroud)


esk*_*imo 5

与 Dan Rosenstark 的解决方案类似,但改为在新的 iPad Pro 上工作,该解决方案似乎会报告不同的框架和 screen.bounds 高度,具体取决于它是否通过 Xcode 直接在设备上运行,或者是否通过 TestFlight 或通过编译和发布应用商店。当通过 AS 或 TF 时,高度将返回 980,而不是 1024,因为它应该像通过 Xcode 一样,导致它不可能返回 true。

extension UIApplication {
    public var isSplitOrSlideOver: Bool {
        guard let w = self.delegate?.window, let window = w else { return false }
        return !(window.frame.width == window.screen.bounds.width)
    }
}
Run Code Online (Sandbox Code Playgroud)