2012-02-26 3 views
3

J'ai un contrôleur de vue parent qui prend en charge les quatre orientations. Il présente un contrôleur de vue enfant et si le périphérique est pivoté pendant que le contrôleur de vue enfant est présenté, puis que vous fermez l'enfant, le contrôleur de vue parent n'est pas pivoté correctement. Voici le code que j'utilise pour la rotation dans le contrôleur de vue parent:Le contrôleur de vue parent ne pivote pas lorsque le contrôleur de vue enfant est présenté

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

if (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 

    newestIssueCoverImageButton.frame = CGRectMake(40, 20, 688, 865); 
    shadow.frame = CGRectMake(40, 20, 688, 865); 
    recordView.frame = CGRectMake(0, 44, 768, 916); 
    classifiedsWebView.frame = CGRectMake(0, 44, 768, 916); 

} else { 

    newestIssueCoverImageButton.frame = CGRectMake(269, 20, 486, 613); 
    shadow.frame = CGRectMake(269, 20, 486, 613); 
    recordView.frame = CGRectMake(0, 44, 1024, 660); 
    classifiedsWebView.frame = CGRectMake(0, 44, 1024, 660); 

} 

Le parent regarde si ce code n'a pas été utilisé et je viens de tourner l'appareil. Comment puis-je appeler ce code et m'assurer que le contrôleur de vue parent est correctement pivoté lorsque l'utilisateur regarde actuellement l'enfant? Merci de votre aide.

Répondre

8

A partir de docs Apple:

Si un contrôleur de vue est pas visible lorsque un changement d'orientation se produit, les méthodes de rotation ne sont jamais appelés. Toutefois, la méthode viewWillLayoutSubviews est appelée lorsque la vue devient visible. Votre implémentation de cette méthode peut appeler la méthode statusBarOrientation pour déterminer l'orientation du périphérique.

J'ai ajouté un BOOL à suivre quand il est pas le top viewController, puis:

- (void)viewWillLayoutSubviews { 

    if (notTopController) { 

     [self willRotateToInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation] duration:0]; 
     [self willAnimateRotationToInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation] duration:0]; 

     notTopController = NO; 

} 

Works bon pour moi jusqu'à présent.

0

Assurez-vous que les deux contrôleurs de vue parent et enfant prennent en charge la rotation. shouldAutorotateToInterfaceOrientation:

2

shouldAutorotateToInterfaceOrientation, willRotateToInterfaceOrientation, RotateToInterfaceOrientation et ne s'appeler sur le contrôleur de vue en cours/visible, pas les vues « derrière » sur la pile. Dans votre cas, lorsque l'enfant est visible, il est appelé sur l'enfant mais pas sur le parent.

S'il y a eu un événement rotate, lorsque vous remercierez le contrôleur de vue de l'enfant (en supposant une aide d'un NavigationController), shouldAutorotateToInterfaceOrientation seront appelés les parents (mais pas will/didRotate). Si vous voulez voir par vous-même, jetez quelques instructions NSLog() dans toutes ces méthodes. Sachant tout cela, une solution rapide serait de jeter votre code de redimensionnement dans le shouldAutorotateToInterfaceOrientation.

+0

Merci pour votre aide et l'explication. Je vais essayer ça. Btw, j'ai regardé votre profil et votre application Trakr est vraiment cool. –

+0

Merci! Il est actuellement en attente d'examen ... – Kevin

Questions connexes