Информация об ориентации не очень последовательна, и существует несколько подходов. Если в контроллере представления, можно использовать 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];
, и это работает отлично!
Я нашел, что прием решил проблему ориентации 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
- Chris Allinson
Можно достигнуть этого двумя путями:
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, чтобы зеркально отразить, как я вручную отправляю это в подпредставления.
Поэтому, в то время как я не добавляю новый автономный ответ, я говорю, что вышеупомянутое использования и имеет это в виду.Примечание: Я получаю ориентацию строки состояния, поскольку это - единственная вещь, которую называют, когда приложение запускается и является "достаточно правом", чтобы помочь мне переместить материал.
основной проблемой с использованием этого являются лениво загружаемые представления. Обязательно назовите свойство представления Вашего содержавшего и подпредставлений перед установкой их положений в ответ на их ориентацию. Благодарите Apple не катастрофический отказ, когда мы устанавливаем переменные, которые не существуют, вынуждая нас помнить, что они повреждают OO и вынуждают нас сделать это, также... gah, такая изящная система, все же так поврежденная! Серьезно, я люблю Собственный компонент, но это просто не хорошо, поощряет плохой дизайн OO. Не наш отказ, просто напомнив, что Ваш изменять размер функции мог бы работать, но Путь Apple требует, чтобы Вы загрузили представление использованием, не путем создания и инициализации его
В Вашем контроллере представления получите значение только для чтения self.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
это не работает надежное, особенно при использовании нескольких потоков (основной поток UI, фоновый поток для доступа к крупным внешним данным...).
Комментарии: 1) Даже если Ваши наборы приложения портрет ориентации по умолчанию, пользователь может заблокировать его в среде. Таким образом установка значения по умолчанию не является действительно решением работать вокруг этого. 2) Существуют другие задачи как сокрытие панели навигации, чтобы быть помещенным в viewWillAppear, чтобы заставить его работать и в то же время предотвращают мерцание. То же относится к другим представлениям как UITableView willDisplayCell
->, используют его для установки cell.selected и cell.accessoryType.
Один из:
interfaceOrientation
свойство активного контроллера представления. [UIApplication sharedApplication].statusBarOrientation
. [UIDevice currentDevice].orientation
. (Вы, возможно, должны звонить -beginGeneratingDeviceOrientationNotifications
.)