How to check if device orientation is landscape left or right in swift?
Asked Answered
L

7

37
    if UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation) {
        print("landscape")
    }
    if UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation){
        print("portrait")
    }

How can I check if it's landscape left or right?

Lillia answered 28/7, 2016 at 7:30 Comment(2)
Possible duplicate of Getting device orientation in SwiftDanialdaniala
Possible duplicate of How to programmatically determine iPhone interface orientation?Britannic
C
70

you can do something like,

if UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft{

}
else if UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight{

}
else if UIDevice.currentDevice().orientation == UIDeviceOrientation.UIDeviceOrientationPortraitUpsideDown{

}
else if UIDevice.currentDevice().orientation == UIDeviceOrientation.UIDeviceOrientationPortrait{

}

SWIFT 5

    if UIDevice.current.orientation.isLandscape {

    } else if UIDevice.current.orientation.isFlat {

    } else if UIDevice.current.orientation.isPortrait {

    } else if UIDevice.current.orientation.isValidInterfaceOrientation {

    }

SWIFT 3

if UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft {

} else if UIDevice.current.orientation == UIDeviceOrientation.landscapeRight {

} else if UIDevice.current.orientation == UIDeviceOrientation.portrait {

} else if UIDevice.current.orientation == UIDeviceOrientation.portraitUpsideDown {

        } 
Clem answered 28/7, 2016 at 7:32 Comment(2)
this doesn't take into account when the device's interface is in portrait mode but the device is laid out flatTabitha
A switch would be a much better way of doing this than lots of if statements.Translatable
T
11

This works on Swift 3 & 4

switch UIApplication.shared.statusBarOrientation {
    case .portrait:
        //do something
        break
    case .portraitUpsideDown:
        //do something
        break
    case .landscapeLeft:
    //do something
        break
    case .landscapeRight:
        //do something
        break
    case .unknown:
        //default
        break
 }
Tanah answered 15/8, 2017 at 14:40 Comment(2)
You don't need to break in Swift because switch does not fallthrough its cases.Fantast
@Moritz Actually he needs to put break in this particular case because compiler will throw an error if there're no code lines inside case. So putting break into case is an easiest way to make compiler shut up.Earthy
M
5

Swift 5.0:

UIDevice.current.orientation.isLandscape 
UIDevice.current.orientation.isFlat
UIDevice.current.orientation.isPortrait
UIDevice.current.orientation.isValidInterfaceOrientation

isFlat: Indicating whether the specified orientation is face up or face down (The device is held parallel to the ground with the screen facing downwards or Not).

isValidInterfaceOrientation: Indicating whether the specified orientation is one of the portrait or landscape orientations.

IMPORTANT NOTE:

If you have set some views to landscape form manually, so "isLandscape" value is not correct.

In this case you can use this condition:

if UIScreen.main.bounds.height < UIScreen.main.bounds.width {
    print("LandScape Views")
    print("Portrait Views")
}

For example I wanted to play all videos in landscape form while my app was only for portrait form, so in video views I used this condition in order to check if the view is landscape or not, independent of the phone orientation.

Maltz answered 10/11, 2019 at 12:53 Comment(0)
C
3

UIDeviceOrientation will return a value for that:

   enum UIDeviceOrientation : Int {
        case Unknown
        case Portrait
        case PortraitUpsideDown
        case LandscapeLeft
        case LandscapeRight
        case FaceUp 
        case FaceDown
    }
Culberson answered 28/7, 2016 at 7:32 Comment(0)
H
3

There is one thing that destroy all this answers - it's iOS9 iPad multitasking.

On iOS 9, an iPad app by default opts into iPad multitasking. This means that it must adopt all orientations at all times. Since you have not opted out of iPad multitasking, the runtime assumes that you do adopt all orientations at all times — and thus it doesn't need to bother to ask you what orientations you permit, as it already knows the answer (all of them).

To do right cell size for UICollectionView I do next :

func collectionView(_ collectionView: UICollectionView, layout 
    collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        if UIDevice.current.userInterfaceIdiom == .phone {
            return CGSize(width: collectionView.frame.size.width, height: 120)
        } else {
            var width:CGFloat = 0
            let height = 250
            // because of iOS9 and iPad multitasking
            if (UIApplication.shared.statusBarOrientation.rawValue <= UIInterfaceOrientation.portraitUpsideDown.rawValue) {
                width = (collectionView.frame.size.width - 3) / 3
            } else {
                width = (collectionView.frame.size.width - 4) / 4
            }
            return CGSize(width: Int(width), height: Int(height))
        }
    }

and inside viewWillTransition next:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if let layout = self.collectionViewLayout as? UICollectionViewFlowLayout {
            layout.invalidateLayout()
        }
}

because it works faster than without.

Headship answered 28/8, 2017 at 13:2 Comment(0)
L
1

Swift 3+

switch UIDevice.current.orientation {
case .faceUp:
  print("flat - up")
case .faceDown:
  print("flat - down")
case .landscapeLeft:
  print("landscape - left")
case .landscapeRight:
  print("landscape - right")
case .portrait:
  print("portrait - normal")
case .portraitUpsideDown:
  print("portrait - upsideDown")
case .unknown:
  print("unknown")
}
Lepore answered 18/1, 2019 at 14:14 Comment(0)
B
1

SWIFT 4.2

if UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft {
                print("Landscape Left")
            } 
    else if UIDevice.current.orientation == UIDeviceOrientation.landscapeRight{
                print("Landscape Right")
            } 
    else if UIDevice.current.orientation == UIDeviceOrientation.portraitUpsideDown{
               print("Portrait Upside Down")
            } 
    else if UIDevice.current.orientation == UIDeviceOrientation.portrait {
                print("Portrait")
    }
Backgammon answered 28/1, 2019 at 10:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.