Getting device orientation in Swift

后端 未结 13 1371
滥情空心
滥情空心 2020-11-28 23:23

I was wondering how I can get the current device orientation in Swift? I know there are examples for Objective-C, however I haven\'t been able to get it working in Swift.

相关标签:
13条回答
  • 2020-11-28 23:43

    Swift 4:

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
            if UIDevice.current.orientation.isLandscape {
                print("landscape")
            } else {
                print("portrait")
            }
        }
    
    0 讨论(0)
  • 2020-11-28 23:43

    Swift 3+

    Basically:

    NotificationCenter.default.addObserver(self, selector: #selector(self.didOrientationChange(_:)), name: .UIDeviceOrientationDidChange, object: nil)
    
    @objc func didOrientationChange(_ notification: Notification) {
        //const_pickerBottom.constant = 394
        print("other")
        switch UIDevice.current.orientation {
            case .landscapeLeft, .landscapeRight:
                print("landscape")
            case .portrait, .portraitUpsideDown:
                print("portrait")
            default:
                print("other")
        }
    }
    

    :)

    0 讨论(0)
  • 2020-11-28 23:47

    Apple recently got rid of the idea of Landscape vs. Portrait and prefers we use screen size. However, this works:

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.currentDevice().orientation.isLandscape.boolValue {
            print("landscape")
        } else {
            print("portrait")
        }
    }
    
    0 讨论(0)
  • 2020-11-28 23:48

    Swift 3, based on Rob's answer

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if (size.width / size.height > 1) {
            print("landscape")
        } else {
            print("portrait")
        }
    }
    
    0 讨论(0)
  • 2020-11-28 23:50

    I had issues with using InterfaceOrientation, it worked OK except it wasn't accessing the orientation on loading. So I tried this and it's a keeper. This works because the bounds.width is always in reference to the current orientation as opposed to nativeBounds.width which is absolute.

        if UIScreen.mainScreen().bounds.height > UIScreen.mainScreen().bounds.width {
            // do your portrait stuff
        } else {    // in landscape
            // do your landscape stuff
        }
    

    I call this from willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) and from viewDidLoad but it flexible.

    Thanks to zSprawl for the pointer in that direction. I should point out that this is only good for iOS 8 and later.

    0 讨论(0)
  • 2020-11-28 23:53

    statusBarOrientation is deprecated, so no longer available to use like in above answers

    In this code can get orientation without worrying about depreciation. Swift 5 ioS 13.2 Tested 100%

    struct Orientation {
        // indicate current device is in the LandScape orientation
        static var isLandscape: Bool {
            get {
                return UIDevice.current.orientation.isValidInterfaceOrientation
                    ? UIDevice.current.orientation.isLandscape
                    : (UIApplication.shared.windows.first?.windowScene?.interfaceOrientation.isLandscape)!
            }
        }
        // indicate current device is in the Portrait orientation
        static var isPortrait: Bool {
            get {
                return UIDevice.current.orientation.isValidInterfaceOrientation
                    ? UIDevice.current.orientation.isPortrait
                    : (UIApplication.shared.windows.first?.windowScene?.interfaceOrientation.isPortrait)!
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题