Понимание изменения ориентации интерфейса 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. в документации указано:

Обсуждение Система вызывает этот метод при полноэкранном представлении контроллера представления. Вы реализуете этот метод, когда ваш контроллер представления поддерживает две или более ориентации, но контент лучше всего отображается в одной из этих ориентаций.

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

Итак, возникает вопрос: почему метод prefferredOrientation никогда не вызывается? И как нам обрабатывать разные ориентации в разных контроллерах ?. Спасибо! P.S не помечайте вопрос как повторяющийся. Я исследовал все подобные вопросы, и на мой нет ответа.


person Stas    schedule 08.10.2012    source источник


Ответы (3)


О предпочтительном интерфейсе

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

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

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

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

Запуск в пейзаж

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

  1. Убедитесь, что в списке «Поддерживаемые ориентации интерфейса» в Info.plist перечислены все ориентации, которые ваше приложение когда-либо сможет принимать.

  2. Убедитесь, что желаемая ориентация запуска - первая в пределах поддерживаемых ориентаций интерфейса.

Вот и все. На самом деле вам не нужно помещать какой-либо код в контроллер корневого представления для управления начальной ориентацией.

person matt    schedule 15.10.2012
comment
@GeorgeAsda Да, это так. Как вы думаете, что не работает? На самом деле в iOS 8 это даже важнее, чем когда-либо. См. Мой вопрос и ответ здесь, когда впервые вышла iOS 8: stackoverflow.com/questions/24463543/ - person matt; 17.07.2015
comment
@matt в iOS8, и я предполагаю, что в iOS9 нет способа принудительно запустить, скажем, в ландшафтном режиме, а затем поддерживать ВСЕ ориентации. Независимо от того, каков порядок в .plist, приложение все равно запускается, однако пользователь держит устройство. - person George Asda; 17.07.2015
comment
@GeorgeAsda нет способа принудительно запустить, скажем, ландшафтный режим, а затем поддерживать ВСЕ ориентации. Да, есть. Это именно то, что мой ответ описывает, как это сделать. У меня есть приложения, которые делают именно это; Я знаю, что это работает. - person matt; 17.07.2015
comment
@matt хорошо ваши инструкции: Решение вашей общей проблемы запуска в желаемой ориентации: убедитесь, что поддерживаемые ориентации интерфейса в вашем Info.plist перечисляют все ориентации, которые ваше приложение когда-либо будет разрешено принимать. Убедитесь, что желаемая ориентация запуска находится в первую очередь среди поддерживаемых ориентаций интерфейса. Вот и все. На самом деле вам не нужно помещать какой-либо код в контроллер корневого представления для управления начальной ориентацией. Не работает - person George Asda; 17.07.2015
comment
@GeorgeAsda Я только что сказал вам, это работает, и у меня есть приложения, которые это делают. Если вы делаете что-то не так, значит, вы делаете это неправильно. Это не делает ответ моего неправильным. - person matt; 17.07.2015

Если вы хотите запустить модальное представление в ландшафтном режиме, просто поместите этот код в представленный контроллер представления.

- (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:^{}];
person FunkyKat    schedule 13.02.2013

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

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

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

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

    }];

чтобы закрыть это.

person Tintenklecks    schedule 24.03.2015