2012-03-14 6 views
0

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

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

Мне было интересно, может ли кто-нибудь сказать мне, как заставить поворот при изменении зрения, поэтому, когда я переключусь на пейзаж, он сразу повернется к этой ориентации?

Извините, если об этом спросили миллион раз, но я не могу найти нити.

EDIT, я нашел следующий код:

UIViewController *c = [[UIViewController alloc]init]; 
[self presentModalViewController:c animated:NO]; 
[self dismissModalViewControllerAnimated:NO]; 
[c release]; 

Это выполнить поворот, но я не уверен, где называют его контроллер панели вкладок не вызывает такие вещи, как init/viewDidLoad, явно помещая его в viewDidAppear и т. д., вызовет бесконечный цикл.

Любая помощь в этом, пожалуйста?

ответ

3

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

Сначала добавьте UITabBarControllerDelegate к вашим протоколам, в которых TabBarController создается, я использую AppDelegate так сделайте следующее:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate> 

Это позволяет получить доступ к следующему протоколу TabBar:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

Это в основном вызывается всякий раз, когда нажимается TabBarItems (кнопки внизу). Внутри этой функции я извлекаю имя viewControllerNibFile, так как это то, что они названы (возможно, вы можете использовать view.tag, если вы не хотите беспокоиться о соглашениях об именах) и размещать событие в центре уведомлений следующим образом :

NSString *notificationName; 

if ([viewController.nibName isEqualToString:@"IntroViewController"]) 
    notificationName = [NSString stringWithString:@"IntroViewChange"]; 

NSLog(@"%@", notificationName); 
[[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil]; 

Тогда я настроить слушателя в классе, который вызывает следующее событие:

- (void)updateViewRotation 
{ 
    UIViewController *c = [[UIViewController alloc]init]; 
    [self presentModalViewController:c animated:NO]; 
    [self dismissModalViewControllerAnimated:NO]; 
    [c release]; 
} 

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

+0

Хотя есть более простые способы для достижения этой цели, не отправляя дальнейшие уведомления, то 'updateViewRotation' является блестящим. – SwiftArchitect

+0

Это работает, но создает странную вспышку экрана, так как быстро отображается viewcontroller C. –

2

@ Elliott, я дал вам ответ на ваш ответ, потому что он работает лучше, чем любое другое решение, которое я пробовал, но вот упрощение. Вместо того чтобы использовать уведомления, просто поместите это в didSelectViewController:

if ([viewController respondsToSelector:@selector(updateViewRotation)]) { 
    [viewController performSelector:@selector(updateViewRotation)]; 
} 

Это работает только если ViewController нуждаясь это особое внимание, является первой один на вкладке.

Кроме того, обновление для IOS 6 Устаревших:

- (void)updateViewRotation 
{ 
    UIViewController *vc = [[UIViewController alloc] init]; 
    [self presentViewController:vc animated:NO completion:nil]; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 
+0

Спасибо за обновление, я оставлю ваш код здесь, в отличие от обновления моего (если люди не добавят больше обновлений, и в этом случае я их конкатенирую). Рад, что это помогло кому-то, но не идеальное решение! –