2012-06-26 4 views
2

Моя ситуация очень похожа на this question. У меня есть приложение, универсальное, где iPhone находится в портретной ориентации, а iPad - в Пейзаже, и я переключаюсь между всеми моими главными экранами, используя appDelegate.window.rootViewController = newScreen; Приложение iPhone работает отлично. IPad-приложение когда-нибудь бросит экран в портретной ориентации вместо пейзажа. Вот некоторые примеры кода перехода:rootViewController настроен, но отображается как некорректная ориентация

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
      ViewController* v = nil; 
      if (IS_IPAD()) { 
       v = [[ViewController alloc] initWithNibName:@"ViewController-iPad" bundle:nil]; 
      }else{ 
       v = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
      } 
      [appDelegate.window setRootViewController:(UIViewController*)v]; 

Я также попытался это с this other question:

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
      ViewController* v = nil; 
      if (IS_IPAD()) { 
       v = [[ViewController alloc] initWithNibName:@"ViewController-iPad" bundle:nil]; 
      }else{ 
       v = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
      } 

      [UIView 
      transitionWithView:appDelegate.window 
      duration:0.5 
      options:UIViewAnimationOptionTransitionCrossDissolve 
      animations:^(void) { 
       BOOL oldState = [UIView areAnimationsEnabled]; 
       [UIView setAnimationsEnabled:NO]; 
       [appDelegate.window setRootViewController:(UIViewController*)v]; 
       [UIView setAnimationsEnabled:oldState]; 
      } 
      completion:nil]; 

Но ничего не зафиксировал его.

Также попытался использовать [appDelegate.window makeKeyAndVisable] и [appDelegate.window makeKeyWindow] в надежде, что это «шокирует» его в правильной ориентации.

+1

Это своеобразный способ переключения контроллеров представлений, которые я никогда раньше не видел, но он может работать. Вы добавили соответствующий '- (BOOL) shouldAutorotateToInterfaceOrientation:' вашим контроллерам? Это должно быть место, где определяется ориентация интерфейса. – mvds

+0

Я действительно. Похож: if (IS_IPAD()) { return UIInterfaceOrientationIsLandscape (interfaceOrientation); } return (interfaceOrientation == UIInterfaceOrientationPortrait); –

+0

Хм. Вы можете попытаться переключиться на менее строгий способ переключения VC, например. используя фиксированный (пустой) контроллер представления и представляя ваши различные взгляды на них. Это может привести к более надежной ориентации интерфейса. – mvds

ответ

4

У меня есть это!

Вот как выглядит мой переходный блок. Главное, что я сделал, это копировать преобразование (то, что делает фактическое вращение) из CALayer. Обратите внимание, что вам нужно будет включить структуру Quartz и #import <QuartzCore/QuartzCore.h> в верхней части файла.

[UIView transitionWithView:self.window 
        duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{       
    BOOL oldState = [UIView areAnimationsEnabled]; 
    [UIView setAnimationsEnabled:NO]; 
    target.view.layer.transform = window.rootViewController.view.layer.transform; 
    window.rootViewController = target; 
    [UIView setAnimationsEnabled:oldState]; 
} completion:nil]; 
+1

Это похоже на исправление! Огромное спасибо!!! –

+0

Отличное исправление, высоко ценится! –

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