2015-12-24 7 views
0

Я использую следующий код, чтобы увидеть, если устройство находится в ландшафтном режиме или нет:В Swift, как правильно настроить устройство сразу после его запуска?

UIDevice.currentDevice().orientation.isLandscape.boolValue 

Это работает, но если я кладу устройство в ландшафтном режиме, прежде чем приложение запускается, а после viewDidLoad, я называю эту линию кода, он всегда возвращает false.

Если я использую вместо этого:

interfaceOrientation.isLandscape 

возвращает true, который является правильным, но компилятор показывает предупреждение, что interfaceOrientation was deprecated in iOS 8.0.

Каков правильный способ ориентации устройства сразу после запуска приложения?

+0

ваше приложение поддерживает только одну ориентацию? – aaisataev

+0

Приложение поддерживает как портрет, так и пейзаж. Я помещаю устройство в альбомный режим, первая строка возвращает false. Если я вращаюсь, он начинает возвращать правильное значение. –

+0

interfaceOrientation и deviceOrientation - это две разные вещи. Используйте 'UIDeviceOrientationDidChangeNotification', чтобы получить уведомление, когда ориентация устройства изменится – san

ответ

0

У меня есть тест много раз по поводу ориентации, так что я подытожил опыт. Во всех устройствах iPhone, кроме (iPhone6 ​​(с) плюс), единственная ориентация интерфейса - портрет, а если приложение запуска в ландшафтном режиме, должно быть изменение ориентации. Затем получите UIDeviceOrientationDidChangeNotification. Это подходящее время для получения ориентации ,

Запуск, когда в пейзаж с iPhone6, после запуска ориентация изменится сразу: enter image description here

Запуск, когда в пейзаж с iPhone6 ​​плюс, после запуска ориентация никогда не изменял: enter image description here

Два разных скриншот с тем же приложением, enter image description here

Итак, перед тем, как приложение изменит ориентацию, ориентация по-прежнему похожа на домашнюю страницу.

В режиме просмотраDidLoad ориентация еще не изменилась, журнал будет неправильным направлением.

-1

Лучшим способом получить ориентацию является использование автоматической компоновки. Этот URL поможет:

http://www.appcoda.com/learnswift/auto-layout-intro.html

http://www.appcoda.com/introduction-auto-layout/

+0

Да, я использую автоматическую компоновку для ориентации. Есть причина, по которой я хочу получить ориентацию для какой-то другой цели. –

1

DeviceOrientation против ScreenSize vs StatusBar.isLandscape?

IOS, 11, 4 и Свифт Xcode 9.X

Независимо от того, с помощью AutoLayout или нет, Есть несколько способов, чтобы получить правильную ориентацию устройства, и они могут быть использованы для обнаружения изменений вращения при использовании приложение, а также получить правильную ориентацию при запуске приложения или после возобновления с фона.

Это решение прекрасно работают в прошивкой 11 и Xcode 9.X

1. UIScreen.main.bounds.size: Если вы хотите узнать, находится ли приложение в альбомном или портретном режиме, наилучшим началом для начала является viewDidLoad в rootViewController во время запуска и в viewWillTransition(toSize:) в rootViewController, если вы хотите обнаружить изменения вращения во время приложения. находится в фоновом режиме и должен возобновить пользовательский интерфейс в правильной ориентации.

let size = UIScreen.main.bounds.size 
if size.width < size.height { 
    print("Portrait: \(size.width) X \(size.height)") 
} else { 
    print("Landscape: \(size.width) X \(size.height)") 
} 

Это также происходит в начале жизненного цикла приложения/viewController.

2. NotificationCenter

Если вам нужно, чтобы получить фактическую ориентацию устройства (в том числе ничком, лицом вверх, и т.д.). Вы хотите добавить наблюдатель следующим образом (даже если вы делаете это в методе application:didFinishLaunchingWithOptions в AppDelegate, первые уведомления, вероятно, будут запущены после того, как viewDidLoad выполняются

device = UIDevice.current 
device?.beginGeneratingDeviceOrientationNotifications() 
notificationCenter = Notifi`enter code here`cationCenter.default 
notificationCenter?.addObserver(self, selector: #selector(deviceOrientationChanged), 
    name: Notification.Name("UIDeviceOrientationDidChangeNotification"), 
    object: nil) 

И добавить селектор следующим образом. Я разделил это в 2-х частей, чтобы иметь возможность запускать inspectDeviceOrientation() в viewWillTransition

@objc func deviceOrientationChanged() { 
    print("Orientation changed") 
    inspectDeviceOrientation() 
} 

func inspectDeviceOrientation() { 
    let orientation = UIDevice.current.orientation 
    switch UIDevice.current.orientation { 
    case .portrait: 
     print("portrait") 
    case .landscapeLeft: 
     print("landscapeLeft") 
    case .landscapeRight: 
     print("landscapeRight") 
    case .portraitUpsideDown: 
     print("portraitUpsideDown") 
    case .faceUp: 
     print("faceUp") 
    case .faceDown: 
     print("faceDown") 
    default: // .unknown 
     print("unknown") 
    } 
    if orientation.isPortrait { print("isPortrait") } 
    if orientation.isLandscape { print("isLandscape") } 
    if orientation.isFlat { print("isFlat") } 
} 

Обратите внимание, что UIDeviceOrientationDidChangeNotification может быть размещен в несколько раз во время запуска, а в некоторых случаях это может быть .unknown. то, что я видел, что первая правильная орь Уведомление ентация принимается после viewDidLoad и viewWillAppear методов, и прямо перед viewDidAppear или даже applicationDidBecomeActive

объект ориентации даст вам все 7 возможных сценариев (от enum UIDeviceOrientation определения):

public enum UIDeviceOrientation : Int { 
    case unknown 
    case portrait // Device oriented vertically, home button on the bottom 
    case portraitUpsideDown // Device oriented vertically, home button on the top 
    case landscapeLeft // Device oriented horizontally, home button on the right 
    case landscapeRight // Device oriented horizontally, home button on the left 
    case faceUp // Device oriented flat, face up 
    case faceDown // Device oriented flat, face down 
} 

Интересно, что isPortrait только для чтения Bool переменная определена в расширении, чтобы UIDeviceOrientation следующим образом:

extension UIDeviceOrientation { 
    public var isLandscape: Bool { get } 
    public var isPortrait: Bool { get } 
    public var isFlat: Bool { get } 
    public var isValidInterfaceOrientation: Bool { get } 
} 

3. StatusBarOrientation

UIApplication.shared.statusBarOrientation.isLandscape 

Это прекрасно работает, чтобы определить, является ли ориентация портрет или альбомной ориентации и дает те же результаты, как точка 1. Вы можете оценить его в viewDidLoad (для запуска приложения) и в viewWillTransition(toSize:) если исходит из фона. Но это не даст вам информацию о верхнем/нижнем, левом/правом, вверх/вниз, которые вы получаете с уведомлениями (пункт 2)