Подтвердить что ты не робот

Получение ориентации устройства в Swift

Мне было интересно, как я могу получить текущую ориентацию устройства в Swift? Я знаю, что есть примеры для Objective-C, но я не смог заставить его работать в Swift.

Я пытаюсь получить ориентацию устройства и помещать его в оператор if.

Это строка, с которой у меня больше всего проблем:

[[UIApplication sharedApplication] statusBarOrientation]
4b9b3361

Ответ 1

вы можете использовать:

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
    var text=""
    switch UIDevice.currentDevice().orientation{
    case .Portrait:
        text="Portrait"
    case .PortraitUpsideDown:
        text="PortraitUpsideDown"
    case .LandscapeLeft:
        text="LandscapeLeft"
    case .LandscapeRight:
        text="LandscapeRight"
    default:
        text="Another"
    }
    NSLog("You have moved: \(text)")        
}

ОБНОВЛЕНИЕ SWIFT 3

override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
    var text=""
    switch UIDevice.current.orientation{
    case .portrait:
        text="Portrait"
    case .portraitUpsideDown:
        text="PortraitUpsideDown"
    case .landscapeLeft:
        text="LandscapeLeft"
    case .landscapeRight:
        text="LandscapeRight"
    default:
        text="Another"
    }
    NSLog("You have moved: \(text)")        
}

или

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
}

с уведомлением вы можете проверить: IOS8 Swift: как определить изменение ориентации?

ПРИМЕЧАНИЕ. didRotateFromInterfaceOrientation устарела. viewWillTransitionToSize для iOS 2.0 и более поздних версий

Ответ 2

Чтобы получить строку состояния (и, следовательно, UI), такую ​​как код Objective-C, вы просто:

UIApplication.sharedApplication().statusBarOrientation

Вы также можете использовать свойство orientation UIDevice:

UIDevice.currentDevice().orientation

Однако это может не совпадать с ориентацией вашего пользовательского интерфейса. Из документов:

Значение свойства - это константа, указывающая текущий ориентация устройства. Это значение представляет физическое ориентации устройства и может отличаться от текущего ориентация пользовательского интерфейса ваших приложений. Видеть "UIDeviceOrientation" для описания возможных значений.

Ответ 3

Недавно Apple избавилась от идеи "Ландшафт против портрета" и предпочитает использовать размер экрана. Однако это работает:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        print("landscape")
    } else {
        print("portrait")
    }
}

Ответ 4

Чтобы найти текущую ориентацию устройства, просто используйте этот код:

UIApplication.sharedApplication(). StatusBarOrientation

для быстрого 3.0

UIApplication.shared.statusBarOrientation

Ответ 5

У меня были проблемы с использованием InterfaceOrientation, он работал нормально, за исключением того, что он не обращался к ориентации при загрузке. Поэтому я попробовал это, и это хранитель. Это работает, потому что bounds.width всегда относится к текущей ориентации, а не к nativeBounds.width, которая является абсолютной.

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

Я называю это от willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) и от viewDidLoad, но он гибкий.

Благодаря zSprawl для указателя в этом направлении. Я должен отметить, что это хорошо только для iOS 8 и более поздних версий.

Ответ 6

struct DeviceInfo {
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.statusBarOrientation.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.statusBarOrientation.isPortrait
        }
    }
}}

swift4 ответ: вот как я это делаю,

1.works для всех видов контроллера вида

2. Также работайте, когда пользователь поворачивает приложение

3.также в первый раз установите приложение

Ответ 7

Итак, если Apple обесценивает всю ориентировочную строку ( "портрет", "пейзаж" ), тогда вам все равно будет отношение ширины к высоте. (вроде как @bpedit ответ)

Если вы разделите ширину на высоту, если результат меньше 1, то mainScreen или контейнер или что-то еще находится в режиме "портрет". Если результат больше 1, это "пейзажная" живопись.;)

override func viewWillAppear(animated: Bool) {
    let size: CGSize = UIScreen.mainScreen().bounds.size
    if size.width / size.height > 1 {
        print("landscape")
    } else {
        print("portrait")
    }
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if size.width / size.height > 1 {
        print("landscape")
    } else {
        print("portrait")
    }
}

(Я предполагаю, что если вы используете этот подход, то вам, вероятно, не важно, как конкретно обрабатывать условие, когда отношение равно ровно 1, равна ширине и высоте.)

Ответ 8

   override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (toInterfaceOrientation.isLandscape) {
        NSLog("Landscape");
    }
    else {
        NSLog("Portrait");
    }
}

Ответ 9

Swift 3, на основе ответа Роба

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if (size.width / size.height > 1) {
        print("landscape")
    } else {
        print("portrait")
    }
}

Ответ 10

Swift 4:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape {
            print("landscape")
        } else {
            print("portrait")
        }
    }