iPhone - разрешить альбомную ориентацию только на одном контроллере - PullRequest
10 голосов
/ 27 января 2010

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

Но даже тогда, когда устройство находится в альбомном режиме, и я перехожу к следующему экрану из vc1, следующий экран также появляется повернутым в альбомном режиме. Я предполагал, что если я верну ДА только для портретного режима, экран должен отображаться только в портретном режиме.

Это ожидаемое поведение? Как мне достичь того, что я ищу?

Спасибо.

Ответы [ 3 ]

24 голосов
/ 27 января 2010

Вы не можете поддерживать альбомную ориентацию только для одного из контроллеров представления, если используете shouldAutorotateToInterfaceOrientation метод UIViewController.
У вас есть только два варианта выбора: поддерживают ли все контроллеры представления ландшафт или нет, контроллеры просмотра поддерживают его.

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

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

Затем вы можете поворачивать свои виды при обнаружении вращения устройства.

- (void)didRotate:(NSNotification *)notification {
    UIDeviceOrientation orientation = [[notification object] orientation];

    if (orientation == UIDeviceOrientationLandscapeLeft) {
        [xxxView setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
    } else if (orientation == UIDeviceOrientationLandscapeRight) {
        [xxxView setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    } else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
        [xxxView setTransform:CGAffineTransformMakeRotation(M_PI)];
    } else if (orientation == UIDeviceOrientationPortrait) {
        [xxxView setTransform:CGAffineTransformMakeRotation(0.0)];
    }
}
5 голосов
/ 16 ноября 2012

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

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

И вам также нужно добавить этот код в AppDelegate.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{   
    if (window == self.cameraWindow)
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }

    return UIInterfaceOrientationMaskPortrait;
}
0 голосов
/ 14 марта 2013

Поскольку я работал над своим приложением, я советую вам использовать это решение. Используя некоторые условия в типе ориентации метода shouldAutorotateToInterfaceOrientation, мы можем решить эту проблему. Просто попытка по этой ссылке поможет вам.

https://stackoverflow.com/questions/12021185/ios-rotate-view-only-one-view-controllers-view/15403129#154031

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...