2010-04-29 2 views
62

В данном обработчике событий (а не методе «shouldAutorotateToInterfaceOrientation»), как определить текущую ориентацию iPad? У меня есть текстовое поле, которое я должен оживить (когда клавиатура появляется) в представлении «Пейзаж», но не в портретном режиме, и хочу знать, какую ориентацию я хочу увидеть, нужна ли анимация.Получить текущую ориентацию iPad?

ответ

132

Ориентационная информация не очень последовательна, и существует несколько подходов. Если в контроллере вида вы можете использовать свойство interfaceOrientation. Из других мест, где вы можете позвонить:

[[UIDevice currentDevice] orientation] 

В качестве альтернативы, вы можете запросить для получения изменения ориентации уведомлений:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

Некоторые люди также хотели, чтобы проверить ориентацию строки состояния:

[UIApplication sharedApplication].statusBarOrientation 
+10

Это очень помогло мне. Я использовал ориентацию [[UIDevice currentDevice]], но когда вы запустили устройство Face up, было невозможно определить, с каким интерфейсом столкнулся. Используя [UIApplication sharedApplication] .statusBarOrientation решил это для меня. Большое спасибо. –

+1

statusBarOrientation работает для меня тоже. – neoneye

+0

Обратите внимание, что ориентация [[UIDevice currentDevice]] будет возвращать 0, если уведомления об ориентации не были включены. – titaniumdecoy

9

Один из:

  • Проверьте interfaceOrientation свойство активного контроллера представления.
  • [UIApplication sharedApplication].statusBarOrientation.
  • [UIDevice currentDevice].orientation. (Возможно, вам потребуется позвонить -beginGeneratingDeviceOrientationNotifications.)
8

Я нашел трюк, чтобы решить проблему ориентации FaceUp !!!

Завершите проверку ориентации до ПОСЛЕ запуска приложения, затем установите переменные, размеры представления и т. Д. !!!

//CODE 

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    //DELAY 
    [NSTimer scheduledTimerWithTimeInterval:0.5 
        target:self 
        selector:@selector(delayedCheck) 
        userInfo:nil 
        repeats:NO]; 

} 


-(void)delayedCheck{ 

    //DETERMINE ORIENTATION 
    if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait){ 
     FACING = @"PU"; 
    } 
    if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown){ 
     FACING = @"PD"; 
    } 
    if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft){ 
     FACING = @"LL"; 
    } 
    if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight){ 
     FACING = @"LR"; 
    } 
    //DETERMINE ORIENTATION 

    //START 
    [self setStuff]; 
    //START 

} 


-(void)setStuff{ 

    if(FACING == @"PU"){ 
      //logic for Portrait 
    } 
    else 
    if(FACING == @"PD"){ 
      //logic for PortraitUpsideDown 
    } 
    else{ 
    if(FACING == @"LL"){ 
      //logic for LandscapeLeft 
    } 
    else 
    if(FACING == @"LR"){ 
      //logic for LandscapeRight 
    } 

} 

//CODE 

Вы можете addSubviews, элементы позиции и т.д., в «» setStuff функции ... все, что первоначально будет зависеть от ориентации !!!

: D

-Крис Allinson

+1

Да, но что делать, если ваше приложение * имеет *, чтобы нарисовать что-то раньше, потому что экран станет черным в противном случае? – zmippie

+0

Когда приложение запускает его, изначально отображается изображение заставки. В приложениях, которые я делаю, я обычно вижу, что файл .xib viewcontroller appDelegate отображает то же изображение, что и заставка, а затем затухает. Я слушаю, когда закончилось постепенное исчезновение, а затем добавьте subviews, которые имеют альфа 0.0, а затем увядают их. Это хороший эффект (похожий на видеоигры, показывающие компании-участники, прежде чем вы сможете играть). Я сохраняю всю свою логику рисования в этих добавленных классах, поэтому приложение уже завершило запуск и запускается, когда выполняется код чертежа. –

+0

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

34

Я думаю

[[UIDevice currentDevice] orientation]; 

не очень надежны. Иногда это работает, иногда нет ... В моих приложениях я использую

[[UIApplication sharedApplication]statusBarOrientation]; 

и он отлично работает!

+3

[[UIDevice currentDevice] ориентация] неисправен .. Он потратил впустую мое время. Спасибо. –

+1

«Надежный» не проблема. Проблема в том, что ориентация UIDevice ** не предназначена для этой цели. ** См. Документацию: http://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#// apple_ref/occ/instp/UIDevice/orientation –

+1

В моем коде мне нужно знать разные ориентации: интерфейс один и один. При съемке важно одно устройство. –

0

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

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

Основная проблема с использованием этой функции - ленивая загрузка. Обязательно вызовите свойство вида вашего содержимого и подпункты «Перед», вы установите свои позиции в ответ на их ориентацию. Благодарим Apple за то, что не сбой, когда мы устанавливаем переменные, которых не существует, заставляя нас помнить, что они ломают OO и заставляют нас это делать тоже ...гах, такая элегантная система, но так сломанная! Серьезно, я люблю Родного, но это просто не хорошо, поощряет плохой дизайн OO. Не наша ошибка, просто напоминание о том, что ваша функция изменения размера может работать, но путь Apple требует загрузки изображения с помощью использования, а не путем его создания и инициализации.

-1

[UIDevice currentDevice].orientation отлично работает.

НО НО !!! ... хитрость заключается в том, чтобы добавить его - (void)viewWillAppear:(BOOL)animated

ехр:

(void)viewWillAppear:(BOOL)animated{ 
    ... 
    BOOL isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation); 
    ... 
} 

Если вы вызываете его на - (void)viewDidLoad, он не работает надежно, особенно если вы используете несколько потоков (основной поток пользовательского интерфейса , фоновый поток для доступа к массивным внешним данным, ...).


Комментарии: 1) Даже если ваше приложение устанавливает по умолчанию портретной ориентации, пользователь может заблокировать его на пейзаж. Таким образом, настройка по умолчанию не является решением для ее работы. 2) Существуют другие задачи, такие как скрытие навигационной панели, которая должна быть размещена в viewWillAppear, чтобы заставить ее работать и в то же время предотвратить мерцание. То же самое относится к другим представлениям, таким как UITableView willDisplayCell -> использовать его для установки cell.selected и cell.accessoryType.

2

Для определения пейзажа против портрета, есть встроенная функция:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation]; 
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation); 
3

Вы можете достичь этого двух способов:

1- Используя следующий метод:

* * Поставьте следующую строку в -(void)viewDidLoad. Метод:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

затем положить этот метод внутри класса

-(void)deviceRotated:(NSNotification*)notification 
{ 

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
    { 
     //Do your textField animation here 
    } 
} 

Описанный выше метод будет проверять ориентацию, когда устройство будет повернута

2- Второй способ заключается путем вставки следующее уведомление внутри -(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, и в соответствии с этим вы делаете анимацию в требуемой ориентации.

0

В вашем представлении контроллер получает значение self.interfaceOrientation (текущая ориентация интерфейса).

1

[UIApplication sharedApplication].statusBarOrientation возвращается портрет, когда это пейзаж, и пейзаж, когда это портрет на старте, в IPad

0

Я пробовал многие из описанных выше способов, но ничего не помогало 100% для меня.

Моим решением было сделать iVar, называемую ориентацией типа UIInterfaceOrientation в контроллере Root View.

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    orientation = self.interfaceOrientation; // this is accurate in iOS 6 at this point but not iOS 5; iOS 5 always returns portrait on app launch through viewDidLoad and viewWillAppear no matter which technique you use. 
} 


- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 
    return YES; 
} 

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    orientation = toInterfaceOrientation; 

} 

Затем, в любом месте, где вам нужно проверить ориентацию вы можете сделать что-то вроде этого:

if(UIInterfaceOrientationIsPortrait(orientation)){ 
    // portrait 
    }else{ 
    // landscape 
    } 

Там еще может быть лучше, но это, кажется, работает 98% времени (несмотря на iOS5) и не слишком сложно. Обратите внимание, что iOS5 всегда запускает iPad в портретном режиме, затем отправляет устройству сообщения willRotateTo и didRotateFromInterfaceOrientation:, поэтому значение будет по-прежнему неточным.

Смежные вопросы