Принудительное изменение ориентации - PullRequest
2 голосов
/ 21 декабря 2011

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

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

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

Любые советы и примеры были бы хорошими, спасибо.

Ответы [ 2 ]

7 голосов
/ 22 декабря 2011

Я смог это сделать, но сейчас предупреждаю, это взлом.

Сначала я создал категорию для UITabBarController, которая называется UITabBarController+SelectiveRotation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

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

Затем мой AppDelegate сделал себя делегатом панели вкладок, и я реализовал этот метод:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    // this ensures that the view that will be shown is presented in a supportred rotation
    UIViewController *c = [[UIViewController alloc]init];
    [viewController presentModalViewController:c animated:NO];
    [viewController dismissModalViewControllerAnimated:NO];
    [c release];
    if ([UIViewController respondsToSelector:@selector(attemptRotationToDeviceOrientation)]) {
        // this ensures that the view will be presented in the orientation of the device
        // This method is only supported on iOS 5.0.  iOS 4.3 users may get a little dizzy.
        [UIViewController attemptRotationToDeviceOrientation];
    }
}

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

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

0 голосов
/ 19 августа 2014

Я думаю, что если вы просто используете следующий код, и он должен работать хорошо.

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
// this ensures that the view that will be shown is presented in a supportred rotation
UIViewController *c = [[UIViewController alloc]init];
[viewController presentModalViewController:c animated:NO];
[viewController dismissModalViewControllerAnimated:NO];
[c release];
if ([UIViewController respondsToSelector:@selector(attemptRotationToDeviceOrientation)]) {
    // this ensures that the view will be presented in the orientation of the device
    // This method is only supported on iOS 5.0.  iOS 4.3 users may get a little dizzy.
    [UIViewController attemptRotationToDeviceOrientation];
}

}

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