2010-05-14 10 views
5

J'ai créé une vue dans l'AppDelegate, que j'ajoute à la fenêtre comme ceci: DeviceOrientation Check in AppDelegate

[window addSubview:myView];
Je veux être capable de vérifier l'orientation de l'appareil chaque fois que je reviens à cette vue, donc je peux apporter quelques modifications à il. Comment puis-je faire cela dans l'appDelegate?

Répondre

11

Vous pouvez mettre en œuvre l'une de ces méthodes dans le délégué pour voir quand l'application tourne:

- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration; 
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation; 

Ou tout simplement vérifier l'orientation de la barre d'état UIApplication au besoin avec:

[[UIApplication sharedApplication] statusBarOrientation]; 

Le l'orientation de l'appareil, qui peut correspondre ou non à l'orientation de l'interface, est:

[[UIDevice currentDevice] orientation]; 
0

Dans les exemples Apples vous averti via la méthode déléguée:

- (void)orientationChanged:(NSNotification *)notification 
{ 
    // We must add a delay here, otherwise we'll swap in the new view 
    // too quickly and we'll get an animation glitch 
    NSLog(@"orientationChanged"); 
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0]; 
} 

Et puis pour afficher un écran de portrait:

- (void)updateLandscapeView 
{ 
PortraitView *portraitView = [[PortraitView alloc] init]; 
portraitView.delegate = self; 
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView) 
{ 
    [self presentModalViewController: portraitView animated:YES]; 
    isShowingLandscapeView = YES; 
    } 
else if (deviceOrientation == UIDeviceOrientationPortrait && isShowingLandscapeView) 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
    isShowingLandscapeView = NO; 
    } 
[portraitView release]; 
} 

Bien sûr, vous devez concevoir la PortraitView en tant que classe de délégué pour que cela fonctionne comme prévu.

Pas le seul moyen, mais je trouve que cela fonctionne bien et ses exemples dans les pommes. Je ne le ferais pas dans l'Appdelegate, mais plutôt votre opinion, je ne sais pas votre conception si.

+0

s'il vous plaît voir ma nouvelle réponse Je vais vous expliquer un nouveau problème que j'ai avec votre solution – ludo

1

Voici ce que j'ai essayé d'abord lorsque l'application est en charge pour la première fois dans le didFinishLauching


[[NSNotificationcenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object: nil]; 

- (void)orientationChanged:(NSNotification *)notification 
{ 
    [self performSelector:@selector(showScreen) withObject:nil afterDelay:0]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIDeviceOrientationDidChangeNotification" object:nil]; 
} 

-(void)showScreen { 

UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; 
if (deviceOrientation == UIDeviceOrientationLandscapeLeft || UIDeviceOrientationLandscapeRight) { 

    CGRect screenRect = [[UIScreen mainScreen] bounds]; 

} 

} 

Le paysage est détecté, mais la largeur du spectacle screenRect = 768 et la hauteur = 1024 (je suis dans un Appareil Ipad).

+0

Je pense que le problème est que vous êtes juste en train de vérifier si elle a été tournée. Vous ne faites rien avec ça. Si vous présentez une nouvelle vue, vous devriez voir que les limites sont ce que vous attendez. La façon dont je soupçonne que le système d'exploitation le traiterait est la même que si elle ne répondait pas à l'orientation modifiée à moins que vous ne fassiez quelque chose dans votre showSceen. Si cela a du sens .... – Rudiger

+0

Non je ne comprends pas vraiment, vous m'avez dit de présenter une nouvelle vue mais comment puis-je faire cela si mon screenRect indique toujours le mode portrait? – ludo

+0

Créez un nouveau UIView et présentez-le comme vous le feriez pour n'importe quel autre ViewController, sauf si vous faites quelque chose dans la plume en mode paysage. Ce que vous faites dans le code est si l'orientation est le paysage, présente une nouvelle vue qui est dans le paysage, sinon rejette la vue du paysage – Rudiger