iOS: ориентация интерфейса Изменения, когда поп-диспетчер представления

Все диспетчеры представления в моем приложении работают только в портретной ориентации кроме той, которая может быть портретом или ориентированным пейзажем.

У меня есть некоторый сценарий использования как следующее:

  1. я выдвигаю диспетчера, который работает в обеих ориентациях к UITabBarController
  2. Пользовательская ориентация изменения от portait до пейзажа
  3. Пользовательская пресса "кнопка"Назад""

После этих действий применение остается в альбомной ориентации и не изменяет ее автоматически на портрет.

Я управляю диспетчером представления ориентация, используя supportedInterfaceOrientations (я использую iOS 6.0). Что я делаю неправильно? Как я могу получить правильное поведение, когда применение автоматически изменяет ориентацию на позволенный когда пользовательская кнопка "Назад" прессы? Спасибо за ответ!

9
nl ja de
Этот сценарий объяснен в документации Apple здесь.
добавлено автор Dheeraj V.S., источник

4 ответы

В iOS 6 (и возможно ранее), если диспетчер представления за кадром, когда устройство вращается, это не получает уведомления. И при этом это не становится посланным willAnimateRotationToInterfaceOrientation:duration: , когда это становится диспетчером вида сверху.

Необходимо отслеживать текущую ориентацию диспетчера представления и проверить ориентацию устройства в viewWillAppear: . Если они отличаются, можно использовать willAnimateRotationToInterfaceOrientation:duration: , чтобы установить его правильно.

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

Стандартные решения:

@implementation MyHandlesOffscreenRotationController
{
    BOOL   isShowingPortrait;
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    isShowingPortrait = UIInterfaceOrientationIsPortrait(
                        [[UIApplication sharedApplication] statusBarOrientation]);
}


- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

        BOOL currIsPortrait = UIInterfaceOrientationIsPortrait(
                              [[UIApplication sharedApplication] statusBarOrientation]);

    if ((isShowingPortrait && !currIsPortrait) ||
        (!isShowingPortrait && currIsPortrait)) {
        [self willAnimateRotationToInterfaceOrientation:
                [[UIApplication sharedApplication] statusBarOrientation]
                                              duration:0.0f];
    }
}

@end
2
добавлено
Это - достойный ответ, кроме вас должны установить isShowingPortrait после того, как вы сменили друг друга, таким образом, его обновленный. иначе это будет только работать одно время. (работы для ios7 также)
добавлено автор zero3nna, источник

iOS 9 и выше

Во время поп просто пишут ниже - упомянутый код в вашем <сильном> viewWillAppear метод.

[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]forKey:@"orientation"];

С этим ваша точка зрения появится в режиме портрета.

2
добавлено

Просто отвергните - (BOOL) shouldAutoRotate и - (NSUInteger) supportedInterfaceOrientations в UINavigationController категория, тогда ViewController вызовет, вращаются к его поддержанной ориентации после поп от другого ViewController.

@implementation UINavigationController (Rotate)

- (BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

@end
1
добавлено

У P.L. есть хорошее решение в этой теме: Представьте и немедленно увольте пустого модального диспетчера представления, который позволяет только портрет | пейзаж

, Как изменить ориентацию устройства программно в iOS 6

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.