#iphone #objective-c #ipad #orientation
#iPhone #objective-c #iPad #ориентация
Вопрос:
Мне нужно убедиться, что при UIViewController
загрузке моего устройства оно вращается по мере необходимости.
Я внедрил shouldAutorotateToInterfaceOrientation
методы, и все они работают нормально, за исключением случаев, когда приложение загружается впервые (когда iphone находится в альбомном режиме) или при переходе из UIViewController, который был в портретном режиме, interfaceOrientation
и [[UIDevice currentDevice] orientation]
всегда возвращает портретный режим!
Я читал блоги и даже некоторые вопросы SO, но ни один из них, похоже, не решает основную проблему.
Я использую стандартное приложение UINavigationController. Таким образом, первое представление — это первый помещенный контроллер в стек. Я также пытался задать self.NavigationController его ориентацию, но тоже безуспешно.
Мы высоко ценим любую помощь здесь.
РЕДАКТИРОВАТЬ: Вот мой код для отображения
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[self navigationController] setNavigationBarHidden:YES animated:NO];
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
[self setPortraitMode];
else
[self setLandscapeMode];
}
РЕДАКТИРОВАТЬ 2
Вот как я распечатываю текущий
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
NSLog(@"currentDevice: %d", (int)orientation);
NSLog(@"statusbar: %d", (int)[UIApplication sharedApplication].statusBarOrientation);
NSLog(@"nav controller: %d", (int)self.navigationController.interfaceOrientation);
NSLog(@"interface orientation: %d", (int)self.interfaceOrientation);
Все они выводят «1»
но когда я помещаю этот код в willRotateToInterfaceOrientation
метод, тогда они выводят правильные значения int (1,2,3 или 4).
Комментарии:
1. Вы когда-нибудь находили ответ на этот вопрос?
2. не могу точно вспомнить, но, посмотрев на ответы, я так не думаю : (
Ответ №1:
Вместо использования [[Ориентация текущего устройства UIDevice]] для проверки ориентации используйте ориентацию строки состояния, чтобы получить точную ориентацию:- [UIApplication sharedApplication].statusBarOrientation . У меня также возникла проблема при проверке ориентации текущего устройства, оно не всегда возвращает точную ориентацию
Комментарии:
1. вы вернули yes в shouldAutorotateToInterfaceOrientation?
2. есть ли у вас какой-либо родительский контроллер для этого контроллера представления, который не возвращает yes для shouldAutorotate. также проверьте это
3. следует помнить одну вещь, о которой я упоминал, это то, что фактические изменения ориентации работают нормально. Просто при запуске приложения ориентация неправильная, и я не могу это исправить.
4. эй, возможно, проблема в том, что вы обработали код setPotraitMode, или в представлении появится ландшафтный режим. Теперь viewWillAppear вызывается до того, как будет вызван метод shouldAutorate. Таким образом, изначально ориентация по умолчанию будет potrait при вызове viewWillAppear. Попробуйте обработать свой код в shouldAutorotate или didRotate . Это может решить вашу проблему. Поняли мою точку зрения? А также проверяйте ориентацию только с ориентацией строки состояния, а не с ориентацией текущего устройства
5. хорошая мысль, но, к сожалению, здесь не повезло, имеет ли значение, скрыта ли у меня строка состояния?
Ответ №2:
Приложения для iPhone всегда запускаются в портретной ориентации, потому что начальный экран отображается только в портретной ориентации. Аналогично, изображение запуска предназначено для отображения в книжной ориентации. Единственное исключение — если приложение работает только в альбомной ориентации.
(Приложения для iPad можно запускать в любой ориентации экрана, и вы должны предоставить отдельные изображения запуска для обеих ориентаций.)
Комментарии:
1. итак, вы говорите, что невозможно повернуть вид после загрузки приложения, без ручного перевода телефона обратно в портретное положение и обратно в альбомную ориентацию снова?
2. Нет, я говорю, что ваше приложение всегда запускается в портретном режиме. Вот почему ориентация устройства — UIInterfaceOrientationPortrait в viewWillAppear. Проверьте поведение с помощью приложения Notes, если вы не уверены.
3. нет, в notes, если я открываю его в альбомном режиме, он начинается как книжный, но переключается в альбомный режим
4. Вы хотели знать, почему ориентация устройства всегда является UIInterfaceOrientationPortrait в viewWillAppear, и теперь вы знаете. Если у вас есть другие вопросы, вы должны задать их.
5. нет, первая строка в вопросе гласит
I need to make sure that when my UIViewController loads, it rotates as needed.
У меня все еще нет ответа на это
Ответ №3:
Как насчет проверки ориентации в viewDidAppear: вместо этого? Вы можете использовать ‘animated’, чтобы решить, будете ли вы поворачивать с анимацией или нет. Ваш просмотр может появляться, а затем поворачиваться, но я думаю, что это было бы приемлемо.
РЕДАКТИРОВАТЬ: в дополнение к моим комментариям, вот снимок экрана из Xcode 4 для UIInterfaceOrientation:
Комментарии:
1. На всякий случай — вы добавили разрешенные вращения в свой список?
2. хм, нет, я этого не пробовал, какой ключ для этого?
3. ах, вы имели в виду,
UIInterfaceOrientation
что, если я правильно прочитал документы, предназначено для первоначального запуска, а это не то, что мне нужно здесь, я просто хочу обнаружить и настроить4. Да — я имею в виду «UIInterfaceOrientation». Насколько я понимаю, речь идет о том, какие ориентации поддерживает ваше приложение, а не о первоначальном запуске. (смотрите редактирование моего поста)
5. на самом деле — я хочу сказать, что «UIInterfaceOrientation» касается как начальной, так и поддерживаемой ориентации.
Ответ №4:
Я работал с поворотами и ориентациями приложения iOS. Я обнаружил, что это self.interfaceOrientation
всегда даст вам правильный результат, если вызывается в viewDidAppear
или после этого.
[UIApplication sharedApplication].statusBarOrientation
должно быть предпочтительным при добавлении представления непосредственно в UIWindow
.
Надеюсь, это поможет.