В данном обработчике событий (а не в методе "shouldAutorotateToInterfaceOrientation" ), как определить текущую ориентацию iPad? У меня есть текстовое поле, которое я должен оживить (когда клавиатура появляется) в представлении "Пейзаж", но не в портретном режиме, и хочу знать, какую ориентацию я хочу увидеть, нужна ли анимация.
Получить текущую ориентацию iPad?
Ответ 1
Ориентационная информация не очень согласована, и существует несколько подходов. Если в контроллере вида вы можете использовать свойство interfaceOrientation
. Из других мест вы можете позвонить:
[[UIDevice currentDevice] orientation]
В качестве альтернативы вы можете запросить получение уведомлений об изменении ориентации:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
Некоторым людям также нравится проверять ориентацию строки состояния:
[UIApplication sharedApplication].statusBarOrientation
Ответ 2
Я думаю,
[[UIDevice currentDevice] orientation];
не очень надежный. Иногда это работает, иногда нет... В моих приложениях я использую
[[UIApplication sharedApplication]statusBarOrientation];
и он отлично работает!
Ответ 3
Один из:
- Проверьте свойство
interfaceOrientation
активного контроллера представления. -
[UIApplication sharedApplication].statusBarOrientation
. -
[UIDevice currentDevice].orientation
. (Возможно, вам потребуется позвонить-beginGeneratingDeviceOrientationNotifications
.)
Ответ 4
Я нашел трюк, чтобы решить проблему ориентации 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
В функции 'setStuff' вы можете добавлятьSubviews, элементы позиции и т.д.... все, что изначально зависит от ориентации!!!
: D
- Крис Аллинсон
Ответ 5
Вы можете достичь этого двумя способами:
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 и в соответствии с этим вы делаете анимацию в требуемой ориентации.
Ответ 6
Для определения пейзажа и портрета есть встроенная функция:
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
Ответ 7
[UIApplication sharedApplication].statusBarOrientation
возвращает портрет, когда он пейзаж, и пейзаж, когда он портрет при запуске, в iPad
Ответ 8
Я не знаю почему, но каждый раз, когда мое приложение запускается, первые 4 правы, но впоследствии я получаю противоположную ориентацию. Я использую статическую переменную, чтобы считать это, а затем BOOL, чтобы перевернуть, как я вручную отправлю это в subviews.
Поэтому, когда я не добавляю новый автономный ответ, я говорю, что использую вышеизложенное и помню об этом. Примечание. Я получаю ориентацию строки состояния, так как это единственное, что вызывается при запуске приложения и "достаточно верно", чтобы помочь мне переместить материал.
Основная проблема с использованием этого - это лениво загруженные представления. Обязательно вызовите свойство вида вашего содержимого и подпункты "Перед", вы установите свои позиции в ответ на их ориентацию. Благодарим Apple за то, что не сбой, когда мы устанавливаем переменные, которых не существует, заставляя нас помнить, что они ломают OO и заставляют нас это делать... gah, такая элегантная система, но так сломанная! Серьезно, я люблю Родной, но это просто не хорошо, поощряет плохой дизайн OO. Не наша ошибка, просто напоминание о том, что ваша функция изменения размера может работать, но Apple Way требует, чтобы вы загружали представление с помощью, а не создавали и инициализировали его
Ответ 9
В вашем контроллере просмотра получите значение только для чтения self.interfaceOrientation(текущая ориентация интерфейса).
Ответ 10
Я пробовал много из вышеперечисленных методов, но ничто, казалось, не работало на 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:, поэтому значение будет по-прежнему неточным.
Ответ 11
[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.