Получить текущую ориентацию iPad?
в данном обработчике событий (не метод "shouldAutorotateToInterfaceOrientation") как определить текущую ориентацию iPad? У меня есть текстовое поле, которое я должен анимировать (когда появляется клавиатура) в альбомном режиме, но не в портретном режиме и хочу знать, в какой ориентации я нахожусь, чтобы увидеть, нужна ли анимация.
11 ответов:
информация об ориентации не очень последовательна, и есть несколько подходов. Если в контроллере вида, вы можете использовать
interfaceOrientation
собственность. Из других мест вы можете позвонить:[[UIDevice currentDevice] orientation]
кроме того, вы можете запросить получение уведомлений об изменении ориентации:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
некоторые люди также хотели бы проверить ориентацию строки состояния:
[UIApplication sharedApplication].statusBarOrientation
Я думаю
[[UIDevice currentDevice] orientation];
не очень надежный. Иногда это работает, иногда нет... В моих приложениях я использую
[[UIApplication sharedApplication]statusBarOrientation];
и он прекрасно работает!
одним из:
- Регистрация
interfaceOrientation
свойство активного контроллера вида.[UIApplication sharedApplication].statusBarOrientation
.[UIDevice currentDevice].orientation
. (Возможно, вам придется позвонить-beginGeneratingDeviceOrientationNotifications
.)
Я нашел трюк, чтобы решить проблему ориентации лицом вверх!!!
отложите проверку ориентации до тех пор, пока приложение не начнет работать, а затем установите переменные, размеры представления и т. д.!!!
//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
вы можете добавить subviews, элементы позиции и т.д. в функции 'setStuff'... все, что изначально будет зависеть от ориентации!!!
: D
-Крис Аллисон
вы можете достичь этого двумя способами:
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 и в соответствии с ним вы сделаете свою анимацию в требуемой ориентации.
для определения ландшафта против портрета, есть встроенная функция:
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation]; BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
[UIApplication sharedApplication].statusBarOrientation
возвращает портрет, когда это пейзаж, и пейзаж, когда это портрет при запуске, в iPad
Я не знаю, почему, но каждый раз, когда мое приложение запускается, первые 4 правы, но впоследствии я получаю противоположную ориентацию. Я использую статическую переменную для подсчета этого, а затем имею BOOL, чтобы перевернуть, как я вручную отправляю это в subviews.
поэтому, пока я не добавляю новый автономный ответ, я говорю, что используйте вышеизложенное и имейте это в виду. Примечание: Я получаю ориентацию строки состояния, так как это единственное, что вызывается при запуске приложения и "достаточно правильно", чтобы помочь мне двигаться материал.
основная проблема с использованием этого представления лениво загружается. Обязательно вызовите свойство view ваших содержащихся и вложенных представлений "прежде", чем вы установите их позиции в ответ на их ориентацию. Спасибо Apple за то, что не рушится, когда мы устанавливаем переменные, которые не существуют, заставляя нас помнить, что они ломают OO и заставляют нас делать это тоже... Боже, такая элегантная система, но все же такая сломанная! Серьезно, Я люблю родной, но это просто нехорошо, поощряет плохой дизайн OO. Не наша вина, просто напоминая, что ваша функция изменения размера может работать, но путь Apple требует, чтобы вы загружали представление с помощью, а не путем его создания и инициализации
в вашем представление-контроллер, сделать только для чтения значение собственной личности.interfaceOrientation (текущая ориентация интерфейса).
Я пробовал многие из вышеперечисленных методов, но ничто, казалось, не работает на 100% для меня.
мое решение состояло в том, чтобы сделать iVar под названием ориентация типа UIInterfaceOrientation в контроллере корневого представления.
- (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:, поэтому значение все равно будет неточным вкратце.
[UIDevice currentDevice].orientation
работает отлично.но!!! ... хитрость заключается в том, чтобы добавить его в
(void)viewWillAppear:(BOOL)animated
exp:
(void)viewWillAppear:(BOOL)animated{ ... BOOL isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation); ... }
если вы называете это по -
(void)viewDidLoad
, он не работает надежно, особенно если вы используете несколько потоков (основной поток пользовательского интерфейса, фоновый поток для доступа к массивным внешним данным,...).
комментарии: 1) Даже если ваше приложение устанавливает портрет ориентации по умолчанию, пользователь может заблокировать его в альбомной ориентации. Таким образом, установка по умолчанию на самом деле не является решением для работы вокруг него. 2) есть и другие задачи, такие как скрытие панели навигации, которая должна быть размещена в viewWillAppear, чтобы заставить ее работать и в то же время предотвратить мерцание. То же самое относится и к другим представлениям, таким как UITableView
willDisplayCell
- > используйте его для установки ячейки.выделена и ячейка.accessoryType.