Понимание изменения ориентации интерфейса 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;
}
Как вы можете видеть, я пытаюсь вернуть ландшафтную ориентацию в предпочтительном методе, но он никогда не вызывается. p. s. документация гласит:
Обсуждение система вызывает этот метод при представлении представления контроллер на весь экран. Вы реализуете этот метод, когда ваше представление контроллер поддерживает два или более ориентации, но содержание появляется лучше всего в одной из этих ориентаций.
Если ваш контроллер вида реализует этот метод, то при предъявлении, его вид показан в предпочтительной ориентации (хотя он может позже быть повернутым к другому поддерживаемому вращению). Если вы не реализуете этот метод, система представляет контроллер вида, используя текущий ориентация строки состояния.
Итак, возникает вопрос: почему метод предварительной ориентации никогда не получает называется? И как мы должны обращаться с различными ориентациями в разных контроллерах?. Спасибо! P. S не помечает вопрос как дубликат. Я исследовал все подобные вопросы, и они не имеют ответа на мой.
3 ответа:
О preferredInterfaceOrientationForpresentation
"Представленный "и" презентация "- это не какие-то расплывчатые термины, означающие"появляется". Это точные технические термины, означающие, что этот контроллер вида вводится в игру с вызовом
preferredInterfaceOrientationForPresentation
никогда не вызывается, потому что это не" представленный " контроллер вида. Здесь нет никакого "представления".presentViewController:animated:completion:
. Другими словами, это событие приходит только в том случае, если это то, что мы привыкли называть "модальным" контроллером вида.Ну, ваш контроллер вида не модальный контроллер вида; онне введен в игру с
Я говорю об этом очень определенно, потому что думаю, что многие люди будут сбиты с толку или введены в заблуждение так же, как и вы. Так что, возможно, эта записка поможет им.presentViewController:animated:completion:
. Таким образом, здесь нет никакого" представления", и поэтомуpreferredInterfaceOrientationForPresentation
здесь неуместно.Запуск в ландшафт
В iOS 6, ключ "поддерживаемые ориентации интерфейса" в вашей информации.plist-это принято гораздо серьезнее, чем раньше. Решение вашей общей проблемы запуска в желаемую ориентацию:
Вот и все, что нужно сделать. На самом деле вам не нужно вводить какой-либо код в корневой контроллер вида для управления начальной ориентацией.
Убедитесь, что" поддерживаемые ориентации интерфейса " в вашей информации.plist перечисляет все ориентации, которые ваше приложение будет когда-либо иметь.
Убедитесь, что требуемая ориентация запуска является первой в "поддерживаемых ориентациях интерфейса".
Если вы хотите запустить модальный вид в ландшафтном режиме, просто поместите этот код в представленный контроллер вида
- (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:^{}];
Существует очень простой ответ: вы можете только изменить или исправить ориентацию интерфейса модального контроллера представления. Если вы это сделаете, то есть с помощью присутствующего модального сегмента в Построителе интерфейсов (или методе навигационного контроллера), вы можете определить допустимые ориентации с помощью
- (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed }
Это событие не запускается, когда вы только нажимаете контроллер вида на навигационном контроллере ... Итак : у вас нет кнопки назад, и вам нужен
[self dismissViewControllerAnimated:YES completion: ^(void) { }];
Чтобы закрыть его.