2014-09-11 4 views
41

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

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

Это линия, что я имею большинство вопросов с:

[[UIApplication sharedApplication] statusBarOrientation] 
+0

Какой ваш проблема? Переводить это в Swift или получать значения, которые вы ожидаете? –

+0

Ориентация устройства не обязательно соответствует ориентации вашего пользовательского интерфейса. Точка обсадной колонны - положите устройство на место и проверьте свой код! – Patrick

ответ

33

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

UIApplication.sharedApplication().statusBarOrientation 

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

UIDevice.currentDevice().orientation 

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

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

47

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

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

СВИФТ 3 UPDATE

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: How to detect orientation change?

Примечание:didRotateFromInterfaceOrientation осуждается Использование viewWillTransitionToSize для прошивки 2.0 и выше

16

Apple, недавно избавился от идеи ландшафта против Портрета и предпочитает мы используем размер экрана. Тем не менее, это работает:

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

Я заметил бы с вашим решением, что Apple заявляет: «Если вы переопределите этот метод в своих настраиваемых контроллерах представлений, всегда вызывайте супер в какой-то момент вашей реализации» – Popmedic

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

Я имел проблемы с использованием 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 и более поздних версий.

+0

НЕ работает на iPads IOS 9 и 10, только исходное значение верное, все следующие значения имеют противоположную ориентацию. –

+0

@ Steven.B Хммм ... отлично работает на моем iPad Air, iPad 3 и симуляторе под iOS 9. Также работал с бета-тестерами. Возможно, вы также используете другой код, который влияет на это. – bpedit

+0

Этот код, вероятно, работает только при использовании в UIViewcontroller, я пытаюсь получить ориентацию и границы в пользовательском классе UIView, но почти каждое тестируемое устройство возвращает разные значения, когда ориентация правильная, чем рамка или границы по-прежнему не соответствуют , –

6

Итак, если 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, равная ширина и высота)

10

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

UIApplication.sharedApplication() statusBarOrientation

для быстрой 3,0

UIApplication.shared.statusBarOrientation

+0

iPad air 1 & 2 возвращает неправильное значение, iPad 2 и iPhone являются правильными. Я действительно пытаюсь найти тот, который работает на всех устройствах, но яблоко действительно стало настоящим беспорядком! :( –

+0

в отличие от 'UIDevice.current.orientation',' UIApplication.shared.statusBarOrientation' доступен при начальной загрузке, а не только после поворота экрана. – ewizard

2

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

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    if (size.width/size.height > 1) { 
     print("landscape") 
    } else { 
     print("portrait") 
    } 
} 
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.Also работы, когда пользователь поворачивает АРР,

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

+0

отлично работает в swift 4. спасибо –

+0

отличный ответ! благодаря – torap

2

Swift 4:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
     if UIDevice.current.orientation.isLandscape { 
      print("landscape") 
     } else { 
      print("portrait") 
     } 
    } 
Смежные вопросы