В данном обработчике событий (а не методе «shouldAutorotateToInterfaceOrientation»), как определить текущую ориентацию iPad? У меня есть текстовое поле, которое я должен оживить (когда клавиатура появляется) в представлении «Пейзаж», но не в портретном режиме, и хочу знать, какую ориентацию я хочу увидеть, нужна ли анимация.Получить текущую ориентацию iPad?
ответ
Ориентационная информация не очень последовательна, и существует несколько подходов. Если в контроллере вида вы можете использовать свойство interfaceOrientation
. Из других мест, где вы можете позвонить:
[[UIDevice currentDevice] orientation]
В качестве альтернативы, вы можете запросить для получения изменения ориентации уведомлений:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
Некоторые люди также хотели, чтобы проверить ориентацию строки состояния:
[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
Вы можете addSubviews, элементы позиции и т.д., в «» setStuff функции ... все, что первоначально будет зависеть от ориентации !!!
: D
-Крис Allinson
Да, но что делать, если ваше приложение * имеет *, чтобы нарисовать что-то раньше, потому что экран станет черным в противном случае? – zmippie
Когда приложение запускает его, изначально отображается изображение заставки. В приложениях, которые я делаю, я обычно вижу, что файл .xib viewcontroller appDelegate отображает то же изображение, что и заставка, а затем затухает. Я слушаю, когда закончилось постепенное исчезновение, а затем добавьте subviews, которые имеют альфа 0.0, а затем увядают их. Это хороший эффект (похожий на видеоигры, показывающие компании-участники, прежде чем вы сможете играть). Я сохраняю всю свою логику рисования в этих добавленных классах, поэтому приложение уже завершило запуск и запускается, когда выполняется код чертежа. –
Достаточно асинхронной отправки в основную очередь. Событие по-прежнему будет срабатывать после того, как ориентация будет обработана, но до обновления экрана. –
Я думаю
[[UIDevice currentDevice] orientation];
не очень надежны. Иногда это работает, иногда нет ... В моих приложениях я использую
[[UIApplication sharedApplication]statusBarOrientation];
и он отлично работает!
[[UIDevice currentDevice] ориентация] неисправен .. Он потратил впустую мое время. Спасибо. –
«Надежный» не проблема. Проблема в том, что ориентация UIDevice ** не предназначена для этой цели. ** См. Документацию: http://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#// apple_ref/occ/instp/UIDevice/orientation –
В моем коде мне нужно знать разные ориентации: интерфейс один и один. При съемке важно одно устройство. –
Я не знаю почему, но каждый раз, когда мое приложение запускается, первые 4 правы, но впоследствии я получаю противоположную ориентацию. Я использую статическую переменную, чтобы считать это, а затем BOOL, чтобы перевернуть, как я вручную отправляю это в subviews.
Так что, пока я не добавляю новый автономный ответ, я говорю использовать вышеизложенное и помнить об этом. Примечание. Я получаю ориентацию в строке состояния, так как это единственное, что вызвано, когда приложение запускается и «достаточно верно», чтобы помочь мне переместить материал.
Основная проблема с использованием этой функции - ленивая загрузка. Обязательно вызовите свойство вида вашего содержимого и подпункты «Перед», вы установите свои позиции в ответ на их ориентацию. Благодарим Apple за то, что не сбой, когда мы устанавливаем переменные, которых не существует, заставляя нас помнить, что они ломают OO и заставляют нас это делать тоже ...гах, такая элегантная система, но так сломанная! Серьезно, я люблю Родного, но это просто не хорошо, поощряет плохой дизайн OO. Не наша ошибка, просто напоминание о том, что ваша функция изменения размера может работать, но путь Apple требует загрузки изображения с помощью использования, а не путем его создания и инициализации.
[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.
Для определения пейзажа против портрета, есть встроенная функция:
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
Вы можете достичь этого двух способов:
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, и в соответствии с этим вы делаете анимацию в требуемой ориентации.
В вашем представлении контроллер получает значение self.interfaceOrientation (текущая ориентация интерфейса).
[UIApplication sharedApplication].statusBarOrientation
возвращается портрет, когда это пейзаж, и пейзаж, когда это портрет на старте, в IPad
Я пробовал многие из описанных выше способов, но ничего не помогало 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:, поэтому значение будет по-прежнему неточным.
- 1. Получить текущую ориентацию устройства
- 2. UITraitCollection iPad как определить текущую ориентацию
- 3. Как получить текущую ориентацию iPhone?
- 4. Android: Получить текущую ориентацию устройства
- 5. Получить начальную ориентацию iPad-приложения
- 6. Как я могу запросить текущую ориентацию экрана iPhone/iPad?
- 7. android - как я могу получить текущую ориентацию?
- 8. Как я могу получить текущую ориентацию экрана?
- 9. Получить текущую ориентацию окна в winform C#
- 10. Исправить ориентацию на iPad
- 11. Получить текущую используемую память в iPhone/iPad
- 12. Как изменить ориентацию iPad-симулятора?
- 13. Каков наилучший способ получить текущую ориентацию для установки просмотров
- 14. Как определить текущую ориентацию для вращения UIImage?
- 15. Использовать текущую ориентацию на контроллере push view
- 16. Изменить ориентацию UIImage в iPhone/iPad
- 17. Определить ориентацию устройства iPad с помощью javascript
- 18. Splash Screen не меняет ориентацию в iPad?
- 19. Определить ориентацию iPad при запуске приложения
- 20. Невозможно иметь всю ориентацию для iPad
- 21. Как отключить ориентацию ландшафта в приложении iPad?
- 22. MFMailComposeViewController создает ориентацию портретной ориентации на iPad
- 23. Как изменить ориентацию iDevice (iPad/iPhone)?
- 24. Как сделать ориентацию быстрее в ipad?
- 25. Как определить ориентацию подкласса viewController в ipad
- 26. Анимация UIView на iPad не учитывает ориентацию
- 27. Невозможно заблокировать ориентацию на iPad Air 2
- 28. Невозможно определить ориентацию при загрузке - iPad
- 29. Скриншот IPad подробно посмотреть ориентацию неправильно
- 30. UISwipeGestureRecognizer, похоже, не уважает текущую ориентацию UIDevice на iPhone 3G
Это очень помогло мне. Я использовал ориентацию [[UIDevice currentDevice]], но когда вы запустили устройство Face up, было невозможно определить, с каким интерфейсом столкнулся. Используя [UIApplication sharedApplication] .statusBarOrientation решил это для меня. Большое спасибо. –
statusBarOrientation работает для меня тоже. – neoneye
Обратите внимание, что ориентация [[UIDevice currentDevice]] будет возвращать 0, если уведомления об ориентации не были включены. – titaniumdecoy