iOS: ориентация устройства при загрузке - PullRequest
51 голосов
/ 04 мая 2011

Кажется, что когда мое приложение загружается, оно не знает своей текущей ориентации:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
if (orientation == UIDeviceOrientationPortrait) {
    NSLog(@"portrait");// only works after a rotation, not on loading app
}

Как только я поворачиваю устройство, я получаю правильную ориентацию, но при загрузке приложения без изменения ориентации кажется, что использование [[UIDevice currentDevice] orientation] не знает текущей ориентации.

Есть ли другой способ проверить это при первой загрузке приложения?

Ответы [ 16 ]

65 голосов
/ 04 мая 2011

РЕДАКТИРОВАТЬ: Я неправильно прочитал ваш вопрос.Это позволит вам запустить приложение в определенных направлениях.Просто понял, что вы пытаетесь выяснить ориентацию при запуске.

Существует способ проверить ориентацию строки состояния на UIApplication:

[[UIApplication sharedApplication] statusBarOrientation];

Оригинальный ответ

Попробуйте установить в приложении plist допустимые для устройства ориентации устройства:

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

Это будет означать, что ваше приложение поддерживает Portrait (кнопка home внизу), альбомная ориентация слеваи вправо.

Затем в ваших UIViewControllers вам потребуется переопределить метод shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) для возврата YES, когда приложение должно повернуться:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

     return interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

Это сообщит UIViewControllerдля автоматического поворота, если устройство находится в одной из ваших поддерживаемых ориентаций.Если вы также хотели поддержать перевернутую ориентацию (портрет с кнопкой «Домой» сверху), добавьте это в свой список и просто верните ДА из этого метода.

Дайте нам знать, как это работает.

11 голосов
/ 04 мая 2011

Я думаю, что это будет работать:

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation;

Согласно справке UIDevice:
Цитата:
"Значение этого свойства всегда возвращает 0, если уведомления об ориентации не были включены при вызове beginGeneratingDeviceOrientationNotifications"
Я изначально предполагал, что это свойство всегда содержало текущую ориентацию, но, видимо, не так.Я предполагаю, что включение уведомлений обрабатывается для нас за кулисами в других ситуациях, когда свойство ориентации обычно доступно, поэтому не было очевидно, что это нужно делать вручную внутри делегата приложения

2 голосов
/ 05 июля 2016

При нагрузке ориентация устройства может быть .Unknown или .FaceUp. Чтобы выяснить, портрет это или пейзаж, я использую statusBarOrientation в качестве резервной копии, например:

    var portraitOrientation = UIDevice.currentDevice().orientation == .Portrait

    if UIDevice.currentDevice().orientation == .Unknown || UIDevice.currentDevice().orientation == .FaceUp {
        portraitOrientation = UIApplication.sharedApplication().statusBarOrientation == .Portrait
    }

Таким образом, я могу заверить, что portraitOrientation всегда говорит мне, находится ли устройство в портретном режиме, а если нет, оно будет в альбомной ориентации. Даже при первой загрузке приложения.

2 голосов
/ 13 ноября 2012

Вы можете сделать это, вставив следующее уведомление внутри

-(void)viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];

, затем поместите следующий метод в ваш класс

-(void)checkRotation:(NSNotification*)notification
{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
    {
         //Do your textField animation here
    }
}

Этот метод проверяет ориентацию строки состоянияIpad или iPhone, и в соответствии с ним вы делаете анимацию в необходимой ориентации.

2 голосов
/ 03 октября 2011

Одна вещь, которую еще никто не коснулся, это то, что вы храните UIDeviceOrientation типы в переменной UIInterfaceOrientation.Они разные и не должны рассматриваться как равные.Обратите внимание, что UIDeviceOrientationLeft равно UIInterfaceOrientationRight (поскольку интерфейс вращается в противоположном направлении по сравнению с устройством).

1 голос
/ 04 мая 2017

Swift 3 на основе кода @Marjin.

var portraitOrientation = UIDevice.current.orientation == .portrait

if UIDevice.current.orientation == .unknown || UIDevice.current.orientation == .faceUp {
     portraitOrientation = UIApplication.shared.statusBarOrientation == .portrait
}

if(portraitOrientation)
{
     // Portrait
}
else
{

}
1 голос
/ 07 марта 2015

Чтобы получить ориентацию из строки состояния, также важно, чтобы все ориентации были включены в файле plist.

0 голосов
/ 23 марта 2018

для тех, кто ищет ответ для Swift 3 или 4. Просто добавьте этот код внутри блока viewDidLoad ().

`let orientation = UIApplication.shared.statusBarOrientation
 if orientation == .portrait {
        // portrait   
 } else if orientation == .landscapeRight || orientation == 
.landscapeLeft{
         // landscape     
 }`
0 голосов
/ 17 февраля 2016

Попробуйте это [[UIApplication sharedApplication] statusBarOrientation];

или внедрите это в приложение делегат

(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
}

работает

0 голосов
/ 24 сентября 2015

Попробуйте это. это работа для меня. В то время, когда метод didfinishedlaunch не обнаружил ориентацию устройства. его взять по умолчанию в качестве портрета. так. Я использую, чтобы проверить ориентацию бара статистики. Я проверяю этот код. поместите его в метод didfinishedlaunch в appdeleget.

UIInterfaceOrientation ориентация = [UIApplication sharedApplication] .statusBarOrientation;

if(orientation == 0) {//Default orientation
    //UI is in Default (Portrait) -- this is really a just a failsafe.

    NSLog("for portrait");


}else if(orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
{

    NSLog("portrait");
}else if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
{

    NSLog("Landscap");
}
...