Получить текущую ориентацию iPad?
Как определить текущую ориентацию iPad в данном обработчике событий (а не в методе shouldAutorotateToInterfaceOrientation)? У меня есть текстовое поле, которое я должен анимировать (когда появляется клавиатура) в альбомном виде, но не в портретном, и хочу узнать, в какой ориентации я нахожусь, чтобы увидеть, нужна ли анимация.
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
.)
Я нашел трюк, чтобы решить проблему ориентации 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
Вы можете добавить Subsviews, позиционировать элементы и т. Д. В функцию 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, чтобы показать, как я вручную отправляю это в подпредставления.
Поэтому, пока я не добавляю новый отдельный ответ, я говорю, что используйте вышеизложенное и помните об этом. Примечание: я получаю ориентацию строки состояния, так как это единственная вещь, которая вызывается при запуске приложения и "достаточно права", чтобы помочь мне переместить вещи.
Основная проблема с этим - лениво загружаемые представления. Обязательно назовите свойство view вашего содержимого и подпредставления "До", вы устанавливаете их позиции в ответ на их ориентацию. Спасибо Apple за то, что она не дает сбоев, когда мы устанавливаем переменные, которые не существуют, заставляя нас помнить, что они нарушают ОО и заставляют нас делать это тоже... да, такая элегантная система, но такая сломанная! Серьезно, я люблю Native, но это просто нехорошо, поощряет плохой ОО дизайн. Не наша вина, просто напоминание о том, что ваша функция изменения размера может работать, но Apple Way требует, чтобы вы загружали представление по использованию, а не создавая и инициализируя его.
Я перепробовал многие из вышеперечисленных методов, но мне казалось, что ничего не работает на 100%.
Мое решение состояло в том, чтобы сделать iVar под названием ориентация типа UIInterfaceOrientation в Root View Controller.
- (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:, поэтому значение все равно будет кратковременно неточным.
В вашем контроллере представления получите доступное только для чтения значение self.interfaceOrientation (текущая ориентация интерфейса).
[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.