Detect if app is running in Slide Over or Split View mode in iOS 9

后端 未结 15 2376
死守一世寂寞
死守一世寂寞 2020-12-04 15:31

In iOS 9, is it possible to detect when an app is running in iOS 9\'s Slide Over or Split View mode?

I\'ve tried reading through Apple\'s documentation on iOS 9 mult

相关标签:
15条回答
  • 2020-12-04 16:18

    And I'm really late to the party! But nonetheless, here's a simple, swifty solution to the problem. Using let width = UIScreen.mainScreen().applicationFrame.size.width we can detect the width of my app's window, and then have things occur when it is smaller than a certain number (i.e. on iPhone screen or in split view), useful to make different things happen on smaller screens. To have the computer check the width over and over again, we can run an NSTimer every hundredth of a second, then do stuff if the width is higher/lower than something.

    Some measurements for you (you have to decide what width to make stuff occur above/below): iPhone 6S Plus: 414.0mm
    iPhone 6S: 375.0mm
    iPhone 5S: 320.0mm
    iPad (portrait): 768.0mm
    iPad (1/3 split view): 320.0mm
    iPad Air 2 (1/2 split view): 507.0mm
    iPad (landscape): 1024.0mm

    Here's a code snippet:

    class ViewController: UIViewController {
    
    var widthtimer = NSTimer()
    
    func checkwidth() {
    
    var width = UIScreen.mainScreen().applicationFrame.size.width
    
    if width < 507 { // The code inside this if statement will occur if the width is below 507.0mm (on portrait iPhones and in iPad 1/3 split view only). Use the measurements provided in the Stack Overflow answer above to determine at what width to have this occur.
    
        // do the thing that happens in split view
        textlabel.hidden = false
    
    } else if width > 506 {
    
        // undo the thing that happens in split view when return to full-screen
        textlabel.hidden = true
    
    }
    }
    
    
    override func viewDidAppear(animated: Bool) {
    
    widthtimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "checkwidth", userInfo: nil, repeats: true) 
    // runs every hundredth of a second to call the checkwidth function, to check the width of the window.
    
    }
    
    override func viewDidDisappear(animated: Bool) {
    widthtimer.invalidate()
    }
    
    }
    

    I hope this can help anyone who comes peeking!

    0 讨论(0)
  • 2020-12-04 16:19

    I made an edit to @Michael Voccola solution which fixed the problem for orientation

    I used this way in my situation to detect all iPad split screen state and handling layout Just call determineLayout() to get current layoutStyle

    private func getScreenSize() -> CGRect { 
         let size = UIScreen.main.bounds
         return size
    }
    
    private func getApplicationSize() -> CGRect {
        let size = UIApplication.shared.windows[0].bounds
        return size
    }
    
    enum LayoutStyle: String {
        case iPadFullscreen = "iPad Full Screen"
        case iPadHalfScreen = "iPad 1/2 Screen"
        case iPadTwoThirdScreeen = "iPad 2/3 Screen"
        case iPadOneThirdScreen = "iPad 1/3 Screen"
        case iPhoneFullScreen = "iPhone"
    }
    
    func determineLayout() -> LayoutStyle {
    
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .iPhoneFullScreen
        }
    
        let screenSize = getScreenSize().size
        let appSize = getApplicationSize().size
        let screenWidth = screenSize.width
        let appWidth = appSize.width
    
        if screenSize == appSize {
    //       full screen
             return .iPadFullscreen
        }
    
        let persent = CGFloat(appWidth / screenWidth) * 100.0
    
        if persent <= 55.0 && persent >= 45.0 {
    //      The view persent between 45-55 that's mean it's half screen
            return .iPadHalfScreen
        } else if persent > 55.0 {
    //      more than 55% that's mean it's 2/3
            return .iPadTwoThirdScreeen
        } else {
    //      less than 45% it's 1/3
            return .iPadOneThirdScreen
        }
    }
    
    0 讨论(0)
  • 2020-12-04 16:22

    Just another way to repackage all of this

    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)
        }
    }
    

    then you can just

    • UIApplication.shared.isSplitOrSlideOver in Swift
    • UIApplication.sharedApplication.isSplitOrSlideOver in Objective-C

    Note that, in Swift, the window object is a double optional... WTF!

    For iOS 13+ (note, I haven't tested the iOS 13 code myself yet)

    extension UIApplication {
    
        public var isSplitOrSlideOver: Bool {
            guard let window = self.windows.filter({ $0.isKeyWindow }).first else { return false }
            return !(window.frame.width == window.screen.bounds.width)
        }
    }
    
    0 讨论(0)
提交回复
热议问题