2012-08-24 12 views
5

Ho creato un'app di test per familiarizzare con l'impostazione di un controller di visualizzazione contenitore personalizzato. Se ruoto il dispositivo quando l'app viene avviata per la prima volta o dopo il passaggio a un altro controller di visualizzazione, la nuova vista viene ridimensionata per occupare l'intero schermo, come previsto. Tuttavia, se ruoto dopo l'avvio dell'app e poi passa a un nuovo controller di visualizzazione, la vista mantiene le dimensioni del suo ritratto anziché diventare più corte e più larghe (in realtà è leggermente diverso - passa da 320.460 a 300.480). Il controller della vista principale è assegnato init'd nel delegato dell'app (senza xib) e impostato come controller della vista radice della finestra. Ecco il codice che ho nel mio MasterViewController (il controller contenitore personalizzato):Visualizzazioni non ridimensionate dopo la rotazione in controller contenitore personalizzato

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.currentController = welcome; 
    [self addChildViewController:welcome]; 
    [self.view addSubview:welcome.view]; 

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)]; 
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [self.view addGestureRecognizer:swipeLeft]; 
} 


- (void)swipeLeft:(UISwipeGestureRecognizer *)gesture { 
    if (gesture.state == UIGestureRecognizerStateRecognized) { 
     UIActionSheet *sheet =[[UIActionSheet alloc] initWithTitle:@"Select A Destination" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"welcome",@"Play",@"Scores", nil]; 
     [sheet showInView:self.view]; 
    } 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    switch (buttonIndex) { 
     case 0:{ 
      if ([self.currentController class] != [WelcomeController class]) { 
       WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil]; 
       [self addChildViewController:welcome]; 
       [self moveToNewController:welcome]; 
      } 
      break; 
     } 
     case 1:{ 
      if ([self.currentController class] != [PlayViewController class]) { 
       PlayViewController *player = [[PlayViewController alloc] initWithNibName:@"PlayViewController" bundle:nil]; 
       [self addChildViewController:player]; 
       [self moveToNewController:player]; 
      } 
      break; 
     } 
     case 2:{ 
      if ([self.currentController class] != [HighScores class]) { 
       HighScores *scorer = [[HighScores alloc] initWithNibName:@"HighScores" bundle:nil]; 
       [self addChildViewController:scorer]; 
       [self moveToNewController:scorer]; 
      } 
      break; 
     } 
     case 3: 
      NSLog(@"Cancelled"); 
      break; 

     default: 
      break; 
    } 
} 

-(void)moveToNewController:(id) newController { 
    [self.currentController willMoveToParentViewController:nil]; 
    [self transitionFromViewController:self.currentController toViewController:newController duration:.6 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{} 
    completion:^(BOOL finished) { 
     [self.currentController removeFromParentViewController]; 
     [newController didMoveToParentViewController:self]; 
     self.currentController = newController; 
    }]; 
} 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES;//(interfaceOrientation == (UIInterfaceOrientationPortrait | UIInterfaceOrientationLandscapeLeft)); 
} 

Tutte le idee perché questo sta accadendo (non so se questo significa che vista la visualizzazione del controller master non è il ridimensionamento, ma quando ottengo questo comportamento non ridimensionante, il riconoscimento dei gesti risponde solo nella vista ristretta, non nell'intero schermo)?

+3

Ho scoperto che se uso un file xib e alloco initWithNibName: bundle: invece di solo init, funziona correttamente. Quindi, sembra avere qualcosa a che fare con la vista che si ottiene quando si fa init. Quando registro la vista, tuttavia, sembra la stessa sia dal init semplice che dal file xib - entrambi hanno lo stesso frame e lo stesso autorize = W + H – rdelmar

+0

definiscono automaticamente il metodo di virtualizzazione 'UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight' – yasirmturk

risposta

0

Non si inviano messaggi di rotazione ai controller di visualizzazione figlio. Almeno non nel codice che hai postato. Dopo aver cambiato Child Controller, si rimuove anche il precedente figlio dall'array ChildViewControllers con [self.currentController removeFromParentViewController], quindi anche se si implementa automaticamente - (BOOL)ForwardAppearanceAndRotationMethodsToChildViewControllers nel proprio ParentViewController è sempre presente un solo ChildViewController.

Ho funzionato, quindi ti incollo come sto facendo questo. Per prima cosa creo tutti i miei ViewController, li aggiungo come controllori di vista figlio a ParentViewController. Quindi chiama didMoveToParentViewController: method.

//Controller1 
Controller1 *c1 = [[Controller1 alloc] init]; 
c1.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
[self addChildViewController:c1]; 
[c1 didMoveToParentViewController:self]; 

//Controller2 
Controller2 *c2 = [storyboard instantiateViewControllerWithIdentifier:@"c2"]; 
index.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
[self addChildViewController:c2]; 
[c2 didMoveToParentViewController:self]; 
c2.view.frame = m_contentView.frame; 
[self.view addSubview:c2.view]; //It is in initial screen so set it right away 
m_selectedViewController = c2; 

//Controller3 
Controller3 *c3 = [storyboard instantiateViewControllerWithIdentifier:@"c3"]; 
compare.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
[self addChildViewController:c3]; 
[c3 didMoveToParentViewController:self]; 

m_controllers = [NSArray arrayWithObjects:c1, c2, c3, nil]; //Hmm now i think this is not needed, I can access viewController directly from self.childViewControllers array 

Poi ho implementato

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers 
{ 
    return YES; 
} 

Il passaggio a controller di vista del bambino è fatto con questo codice

if (value < m_controllers.count) 
{ 
    UIViewController *contentViewController = [m_controllers objectAtIndex:value]; 

    contentViewController.view.frame = m_contentView.frame; 

    [self transitionFromViewController:m_selectedViewController toViewController:contentViewController duration:0 options:UIViewAnimationOptionTransitionNone animations:nil completion:^(BOOL finished) { 
     m_selectedViewController = contentViewController; 
     } 
    ]; 
} 

Questo dovrebbe essere enought. Ma ho alcuni problemi con questo, quindi invio messaggi di rotazione a Child non attivi.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    for (UIViewController *vc in m_controllers) 
    { 
     if(vc != m_selectedViewController) 
      [vc willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    } 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    for (UIViewController *vc in m_controllers) 
    { 
     if(vc != m_selectedViewController) 
      [vc willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    } 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    for (UIViewController *vc in m_controllers) 
    { 
     if(vc != m_selectedViewController) 
      [vc didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
    } 
} 
+0

automaticallyForwardAppearanceAndRotationMethodsToChildViewController è ammortizzato in iOS 6, sostituito da shouldAutomaticallyForwardRotationMethods. Ma non è necessario implementarlo perché il valore predefinito è SÌ. Quindi, non è questo il problema. Ho già trovato la mia risposta come ho menzionato nel mio commento alla domanda. – rdelmar

0

aggiunte manualmente

all'interno

- (void)viewDidLoad 

e risolto il problema,

per qualche motivo non è stato utilizzato il valore all'interno storyboard immagino

Problemi correlati