2011-12-21 4 views
2

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

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

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

Любые советы и примеры были бы замечательными, спасибо.

ответ

7

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

Во-первых, я создал категория для 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

Этот метод может также решить нежелательное изменение ориентации, когда UIWebView закончил играть в полноэкранном режиме видео и заставить ваш портрет UIViewController на альбомную (вызванные UIMoviePlayerController в '- (BOOL) setUIOrientation: (INT) ориентации animated: (BOOL) animated принудительно: (BOOL) принудительно; ') –

+0

Я не знаком с этим API, и я не могу найти его в документации. Это то, что вы написали? –

+1

'UIMoviePlayerController' выделяется' UIWebView' при воспроизведении видео, если ваше приложение поддерживает только портретный режим, UIMoviePlayerController может заставить изменить ориентацию на ландшафт, тогда вы увидите, что сломанный портретный макет будет представлен в ландшафтном режиме после нажатия кнопки " Готово ". постскриптум Частный API –

0

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

- (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]; 
} 

}

Смежные вопросы