Подтвердить что ты не робот

Понимание изменения ориентации интерфейса 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 не помещает вопрос как дубликат. Я исследовал все подобные вопросы, и у них нет ответа на мои вопросы.

4b9b3361

Ответ 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) {

    }];

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