Определите UIInterfaceOrientation на iPad
Мне не нужно указывать ориентацию в этом случае, мне просто нужно ее обнаружить, но у меня проблемы. У меня есть условный код, который должен работать только в портрете, и если устройство в ландшафте, мне нужно сделать что-то еще. Поскольку deviceOrientation не обязательно совпадает с интерфейсом, я не могу найти способ проверить портретный режим.
Большинство учебных пособий, которые я нахожу в Google, - это способы заставить пейзаж или сделать какой-то поворот. Единственное, что я хочу сделать, это определить, что такое ориентация. Вот мой код, который не работает:
-(void)viewDidLoad {
[super viewDidLoad];
//currentOrientation is declared as UIInterfaceOrientation currentOrientation
currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
NSLog(@"%@",currentOrientation); // == NULL
}
Мне нужно определить значение interfaceOrientation и программы условно. Спасибо за вашу помощь!
Ответы
Ответ 1
Знаете ли вы о свойстве interfaceOrientation
класса UIViewController
?
- (void) viewDidLoad {
[super viewDidLoad];
BOOL isPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
// now do whatever you need
}
Или вы после [[UIDevice currentDevice] orientation]
?
Ответ 2
В частности, при запуске я нашел, что для пользовательского интерфейса всегда будет точная точность, независимо от того, что UIDevice говорит о ориентации.
[UIApplication sharedApplication].statusBarOrientation
Ответ 3
self.interfaceOrientation
ненадежна в определенных ситуациях. Например, повторная компоновка вкладок в приложении табуляции возвращает неверное значение.
Однако [UIApplication sharedApplication].statusBarOrientation
всегда надежный. Ты спас меня много времени. Спасибо.
Ответ 4
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if ((orientation == UIInterfaceOrientationLandscapeLeft)
|| (orientation == UIInterfaceOrientationLandscapeRight) )
{
//Landscape
}
else
{
//Portrait
}
Ответ 5
Я знаю, что это очень старый пост. Как бы то ни было, я хотел бы добавить пункт, чтобы сказать, что лучше лучше проверить ориентацию строки состояния. Когда вы звоните self.interfaceorientation
, он вызывает shouldRotateToOrientation
каждый раз. Если вы написали какой-то код в этом методе, он будет выполнен. Поэтому будьте осторожны!
Ответ 6
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation;
if(deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown){
if(debug){
NSLog(@"Nothing to change because it is gone to Flat");
}
return;
}
if(deviceOrientation !=statusBarOrientation){
if(debug){
NSLog(@"\nApple has a bug?:\n UIDeviceOrientation : %d, UIInterfaceOrientation: %d",deviceOrientation, statusBarOrientation );
}
}
Ты не поверишь мне, пока не увидишь на консоли второй выход!
Некоторые ситуации - и они существуют! - отображается последний контент NSLog!
Чем вам придется обходиться, так как у iOS нет ошибок, удачи всем!
А, что... модератор форума, возможно, удалит этот пост, потому что это не значит быть и отвечать по его мнению!
Я надеюсь, что это поможет кому-то однажды, это происходит и на iphone... (там у меня есть)
Ответ 7
Немного смешайте:
BOOL isLandscape = self.view.frame.size.width > self.view.frame.size.height;
(edit) Очевидно, что предыдущие ответы - правильный способ сделать это, и это решение потерпит неудачу в ситуации, когда контроллеры представлений не являются полноэкранными.
Ответ 8
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br>
if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br>
some instructions;
} else {
some instructions;
}
}
Это фрагмент из одной из моих программ.
Конечно, вы можете использовать оператор if в своем уведомлении ViewDidLoad.
Ответ 9
Как и в iOS8, API устарели или возвращают бесполезные результаты, такие как .FaceUp
.FaceDown
Это связано с тем, что Apple не хочет, чтобы вы обновляли свой пользовательский интерфейс с помощью ориентации, но, используя классы, ограничения и пропорции размера (используя n% от супервизора).
Действительно, код, зависящий от ориентации, может не обеспечить хороших результатов во всем диапазоне устройств и прецедентов (особенно многозадачность)
Ответ 10
Я уже проголосовал за ответ @slycrel, но я хотел бы потратить время, чтобы написать это, и указать некоторые вещи, которые, кажется, потеряны в этом старом вопросе и множество других вопросов по этому вопросу.
Верно, что Apple действительно не хочет, чтобы мы обновили большую часть нашего пользовательского интерфейса на основе изменений ориентации, но это все еще вполне возможно, а иногда и необходимо в каждом конкретном случае, и так будет, пока Apple не улучшит свои новые (ish) API (например, viewWillTransitionToFrame:
будет более полезным, чем viewWillTransitionToSize:
. Просто скажите)
Почему я голосовал за ответ @slycrel, связан с тем, что вам нужно иметь в виду как логическое различие между UIDeviceOrientation
и UIInterfaceOrientation
.
Строка состояния - это то, что обозначает известное в настоящее время приложение UIInterfaceOrientation
. Все эти вещи о FaceUp
, FaceDown
относятся только к ориентации устройства, а не к вашим приложениям. Приложение не поддерживает ориентацию устройства в любом случае. Действительно, UIDeviceOrientation
можно полностью игнорировать, если все, что вам нужно сделать, это убедиться, что вы правильно настроили и анимируете вещи в своем интерфейсе, что составляет 99% случаев использования приложений для разработчиков приложений. В настоящее время это достигается с помощью строки состояния UIInterfaceOrientation
из ответа @slycrel:
[UIApplication sharedApplication].statusBarOrientation
Следует отметить, что версия этого свойства readwrite устарела, версия readonly не существует.
Возьмите этот пример:
- У меня есть приложение, которое поддерживает ВСЕ ориентации интерфейсов и контроллер корневого представления, который также поддерживает их.
- Теперь я представляю
UIViewController
, который приведет к тому, что ориентация в строке состояния станет ландшафтной.
- Какая ландшафтная ориентация (слева или справа), на которую она идет, основана на том, что возвращается
preferredInterfaceOrientationForPresentation
для этого контроллера представления, какова текущая ориентация устройства и какие ориентации интерфейса поддерживается контроллером представления (см. следующую точку).
- Строка состояния перейдет в альбомную, независимо от ориентации текущего устройства, поскольку этот контроллер просмотра поддерживает только пейзаж, основанный на том, что возвращается
supportedInterfaceOrientations
. Допустим, что мы поддерживаем оба пейзажа влево и вправо с помощью UIInterfaceOrientationMaskLandscape
.
- Я также хочу условно анимировать этот контроллер представления в положение с преобразованием вращения. Это будет необходимо только при переходе от портрета или портрета вверх дном, к пейзажному левому или ландшафтному праву. В противном случае это будет более простая анимация презентации без вращения.
- Затем, после некоторого времени и использования устройства, я отклоняю этот контроллер представления.
- Теперь я хочу условно анимировать этот контроллер представления с экрана с другим преобразованием вращения. Это будет необходимо только при переходе с пейзажа влево или вправо, на портрет или портрет вверх ногами. В противном случае это будет более простая анимация увольнения без вращения.
- В этот момент ориентация строки состояния станет тем, что решает система, подходит для комбинации предпочтительной ориентации интерфейса контроллера корневого представления и поддерживаемых ориентаций интерфейса, а также тока устройства
UIDeviceOrientation
.
- Поскольку контроллер просмотра мы будем поддерживать ВСЕ ориентации интерфейса, если ваша ориентация устройства - FaceUp или FaceDown, , вы не можете надежно угадать следующий
UIInterfaceOrientation
на основе UIDeviceOrientation
, и вы не должны в любом случае.
- Итак... Ориентация строки состояния на спасение!
Предыдущий пример возможен, поскольку ориентация строки состояния не обновляется, когда начнется переход контроллера представления (система запрашивает делегат перехода для аниматора и т.д.). Затем он обновляется, когда начинается переход анимации (например, к моменту времени animationTransition:
). Таким образом, вы должны иметь хорошее сравнение, просто используя начальное и текущее значения строки состояния UIInterfaceOrientation
.
Даже без использования переходов контроллера просмотра все равно будет безопасно обновлять представления в зависимости от ориентации строки состояния.
Имейте в виду, если вы вручную обновляете строку состояния, и если вы не используете "Просмотр состояния панели управления на основе контроллера" в вашем Info.plist, тогда ваша прикладная логика должна быть когда строка состояния будет и изменит ориентацию. Вероятно, вы будете искать пару имен NSNotification
для этих случаев:
-
UIApplicationWillChangeStatusBarOrientationNotification
-
UIApplicationDidChangeStatusBarOrientationNotification
Кроме этих методов UIApplicationDelegate
:
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
И это другое полезное свойство UIApplication
:
@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;