Принудительный портретный режим

Хорошо, поскольку никто не ответил на мой предыдущий вопрос, я пришел к выводу, что не может быть легкого способа сделать это. Но я настроен оптимистично. Вот моя проблема:

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

Я добавил следующий код в мой AppDelegate:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    NSUInteger orientations = UIInterfaceOrientationMaskAll;

    if (self.window.rootViewController) {
        UIViewController* presented = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presented supportedInterfaceOrientations];
    }
    return orientations;
}

И я добавил это в свой ViewController, который должен быть только в портретном режиме:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (BOOL)shouldAutorotate
{
    return NO;

}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;

}

-(void)viewWillAppear:(BOOL)animated
{
    UIApplication* application = [UIApplication sharedApplication];
    application.statusBarOrientation = UIInterfaceOrientationPortrait;
}

Есть ли способ заставить viewController перейти в портретный режим, даже если предыдущий вид был альбомным? Может быть, я мог бы создать собственный переход, который заставлял бы представление находиться в портретном режиме при нажатии кнопки? Какое будет лучшее / официальное решение здесь?

2 ответа

Проверьте вопрос Как работать с различными ориентациями в iOS 6. См. Ответ там для примера проекта именно того, что вам нужно.

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

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

и добавьте в свой контроллер просмотра, который должен вращаться:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

Убедитесь, что в вашем проекте включены книжная, альбомная и альбомная ориентация. Затем, если вы хотите заблокировать некоторые ориентации для определенного вида:

– application:supportedInterfaceOrientationsForWindow:

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

Для второго view controller добавьте этот метод:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);

}

Для первого контроллера просмотра:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscape);

}
Другие вопросы по тегам