Понимание изменения ориентации интерфейса 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 23

3 ответа:

О preferredInterfaceOrientationForpresentation

preferredInterfaceOrientationForPresentation никогда не вызывается, потому что это не" представленный " контроллер вида. Здесь нет никакого "представления".

"Представленный "и" презентация "- это не какие-то расплывчатые термины, означающие"появляется". Это точные технические термины, означающие, что этот контроллер вида вводится в игру с вызовом presentViewController:animated:completion:. Другими словами, это событие приходит только в том случае, если это то, что мы привыкли называть "модальным" контроллером вида.

Ну, ваш контроллер вида не модальный контроллер вида; онне введен в игру с presentViewController:animated:completion:. Таким образом, здесь нет никакого" представления", и поэтому preferredInterfaceOrientationForPresentation здесь неуместно.

Я говорю об этом очень определенно, потому что думаю, что многие люди будут сбиты с толку или введены в заблуждение так же, как и вы. Так что, возможно, эта записка поможет им.

Запуск в ландшафт

В iOS 6, ключ "поддерживаемые ориентации интерфейса" в вашей информации.plist-это принято гораздо серьезнее, чем раньше. Решение вашей общей проблемы запуска в желаемую ориентацию:

  1. Убедитесь, что" поддерживаемые ориентации интерфейса " в вашей информации.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:^{}];

Существует очень простой ответ: вы можете только изменить или исправить ориентацию интерфейса модального контроллера представления. Если вы это сделаете, то есть с помощью присутствующего модального сегмента в Построителе интерфейсов (или методе навигационного контроллера), вы можете определить допустимые ориентации с помощью

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed
}

Это событие не запускается, когда вы только нажимаете контроллер вида на навигационном контроллере ... Итак : у вас нет кнопки назад, и вам нужен

[self dismissViewControllerAnimated:YES completion: ^(void) {

    }];

Чтобы закрыть его.