2011-03-25 4 views
0

J'ai créé un UIViewController (basé sur How to switch views when rotating) pour basculer entre 2 vues lorsque l'appareil tourne. Chaque vue est "spécialisée" pour une orientation particulière.Vues déplacées hors de la position lors de la rotation

Il utilise la notification de UIDeviceOrientationDidChangeNotification pour changer de vue:

-(void) deviceDidRotate: (NSNotification *) aNotification{ 

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

    NSLog(@"Device rotated to %d!", orientation); 

    if ((orientation == UIDeviceOrientationPortrait) || 
     (orientation == UIDeviceOrientationPortraitUpsideDown)) { 
     [self displayView:self.portraitViewController.view]; 
    }else if ((orientation == UIDeviceOrientationLandscapeLeft) || 
       (orientation == UIDeviceOrientationLandscapeRight)) { 
     [self displayView:self.landscapeViewController.view]; 
    } 

} 

et genre de travaux. Les problèmes apparaissent lorsque je fais pivoter vers Paysage puis vers Portrait. Lorsque vous allez retour au portrait des sous-vues ne sont pas affichés au bon endroit, en particulier la UIPickerView:

Première Portrait: enter image description here

Rotation à Paysage: enter image description here

Retour à Portrait: enter image description here

Si je répète le processus de rotation, les choses empirent. Qu'est-ce que je fais mal?

Le code source est ici: http://dl.dropbox.com/u/3978473/forums/Rotator.zip

Merci à l'avance!

Répondre

0

OK, j'ai trouvé l'erreur. C'est assez simple et stupide: j'ai mélangé le cadre et les limites.

Dans le displayView: code, je définissais le cadre de la vue enfant dans le cadre de la vue parente, alors que ce devrait être les limites du parent.

1

Pour résoudre vos problèmes de décalage, réécrivez la méthode displayView: comme ci-dessous.

- (void) displayView: (UIView *) aView { self.view = aView; }

Les rotations sont toutefois étranges. vous devriez revoir cette partie du code. Utilisez les méthodes de rotation UIViewController

  • (void) willRotateToInterfaceOrientation: Durée:
  • (void) didRotateFromInterfaceOrientation:

au lieu de - (void) deviceDidRotate:

beaucoup plus simple, vous allez évitez ce rebond bizarre, et vous n'avez plus besoin de notifications. Faites quelques lectures sur la documentation apple sur les méthodes que j'ai spécifiées ci-dessus.

Espérons que cela aide.

+0

J'ai essayé de changer le code displayView: comme vous l'avez suggéré, mais cela n'a pas fonctionné. Merci quand même. – cfischer

Questions connexes