Понимание изменения ориентации интерфейса iOS 6
ДОБАВЛЕНО:
Я вижу, что мой вопрос часто просматривается без перекосов, поэтому я решил, что вы, ребята, не получите то, что ищете. Перенаправление вас на вопрос, который имеет действительно хороший ответ о
Как обрабатывать изменения ориентации в iOS6
Конкретные требования к изменениям ориентации:
Ограниченное вращение
Ожидания приветствуются:)
Я создал новый проект из шаблона Master Detail и попытался запустить его с альбомной ориентацией.
Как вы знаете,
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
метод устарел, и мы должны использовать
- (NSUInteger)supportedInterfaceOrientations
и/или
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
Здесь мой код:
- (NSUInteger)supportedInterfaceOrientations {
NSLog(@"supported called");
return UIInterfaceOrientationMaskAll;//Which is actually a default value
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
NSLog(@" preferred called");//This method is never called. WHY?
return UIInterfaceOrientationLandscapeRight;
}
Как вы можете видеть, я пытаюсь вернуть ландшафтную ориентацию в предпочтительном методе, но она никогда не называется.
постскриптум документация гласит:
Обсуждение Система вызывает этот метод при представлении представления контроллер полный экран. Вы реализуете этот метод, когда ваш вид контроллер поддерживает две или более ориентации, но появляется контент лучше всего в одной из этих ориентаций.
Если ваш контроллер представления реализует этот метод, тогда, когда он представлен, его вид показан в предпочтительной ориентации (хотя это может быть позже поворачиваться на другое поддерживаемое вращение). Если вы не реализуете этот метод, система представляет контроллер вида, используя текущий ориентация строки состояния.
Итак, возникает вопрос: почему метод prefferredOrientation никогда не вызван? И как мы должны обрабатывать разные ориентации в разных контроллерах?. Благодарю!
P.S не помещает вопрос как дубликат. Я исследовал все подобные вопросы, и у них нет ответа на мои вопросы.
Ответы
Ответ 1
О предпочтительномИнтерфейсеОриентация для печати
preferredInterfaceOrientationForPresentation
никогда не вызывается, потому что это не "представленный" контроллер представлений. Здесь нет "презентации".
"Представленные" и "презентация" - это не какие-то неопределенные термины, означающие "появляется". Это точные технические термины, означающие, что этот контроллер представления введен в игру с вызовом presentViewController:animated:completion:
. Другими словами, это событие прибывает, только если это то, что мы называли "модальным" контроллером вида.
Ну, ваш контроллер просмотра не является модульным контроллером; он не вводится в игру с помощью presentViewController:animated:completion:
. Таким образом, нет "презентации", поэтому preferredInterfaceOrientationForPresentation
здесь не имеет значения.
Я очень четко говорю об этом, потому что я думаю, что многие люди будут смущены или введены в заблуждение так же, как и вы. Поэтому, возможно, эта заметка поможет им.
Запуск в ландшафт
В iOS 6 ключ "Поддерживаемые интерфейсы" в вашем Info.plist воспринимается гораздо серьезнее, чем раньше. Решение общей проблемы запуска в желаемую ориентацию:
-
Убедитесь, что в разделе "Поддерживаемые интерфейсные интерфейсы" в вашем Info.plist перечислены все ориентации, которые ваше приложение когда-либо будет допущено.
-
Убедитесь, что желаемая начальная ориентация сначала находится в разделе "Ориентация поддерживаемого интерфейса".
Вот и все. Фактически вам не нужно вводить какой-либо код в контроллер корневого представления для управления начальной ориентацией.
Ответ 2
Если вы хотите запустить режим просмотра в ландшафтном режиме, просто поместите этот код в представленный контроллер представления
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation];
if (UIInterfaceOrientationIsLandscape(orient)) {
return orient;
}
return UIInterfaceOrientationLandscapeLeft;
}
Затем представим этот контроллер как обычно
UIViewController *vc = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[vc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self.navigationController presentViewController:vc animated:YES completion:^{}];
Ответ 3
Существует очень простой ответ: вы можете изменить или исправить ориентацию интерфейса модального представленного контроллера представления. Если вы сделаете это, например, в режиме "Модифицировать настоящее время" в построителе интерфейса (или методе контроллера навигации), вы можете определить разрешенные ориентации с помощью
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed
}
Это событие не срабатывает, когда вы только нажимаете контроллер вида на контроллер навигации... так: у вас нет кнопки BACK и вам нужен
[self dismissViewControllerAnimated:YES completion: ^(void) {
}];
чтобы закрыть его.