16

Sto cercando di scoprire se il dispositivo è in modalità verticale o orizzontale. Il mio codice funziona abbastanza bene se il dispositivo non è rivolto verso l'alto. Se rivolto verso l'alto (e orientamento == 5), non distinguerà tra ritratto e paesaggio. Esiste comunque la possibilità di determinare "l'orientamento" in termini di paesaggio/ritratto se UIDeviceOrientation è FaceUp?UIDeviceOrientationFaceUp - come distinguere tra verticale e orizzontale?

Il mio codice:

UIDeviceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation]; 

NSLog(@"orientation: %d", interfaceOrientation); 

if (interfaceOrientation == UIDeviceOrientationIsLandscape(interfaceOrientation)) { 
    NSLog(@"LANDSCAPE!!!"); 
} 

if (interfaceOrientation == UIDeviceOrientationIsPortrait(interfaceOrientation)) { 
    NSLog(@"PORTRAIT!!!"); 
} 

risposta

37

Non si deve confondere UIDeviceOrientation e UIInterfaceOrientation, sono diversi ma correlati, come mostrato dalla loro dichiarazione

typedef enum { 
    UIDeviceOrientationUnknown, 
    UIDeviceOrientationPortrait, 
    UIDeviceOrientationPortraitUpsideDown, 
    UIDeviceOrientationLandscapeLeft, 
    UIDeviceOrientationLandscapeRight, 
    UIDeviceOrientationFaceUp, 
    UIDeviceOrientationFaceDown 
} UIDeviceOrientation; 

typedef enum { 
    UIInterfaceOrientationPortrait   = UIDeviceOrientationPortrait, 
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, 
    UIInterfaceOrientationLandscapeLeft  = UIDeviceOrientationLandscapeRight, 
    UIInterfaceOrientationLandscapeRight  = UIDeviceOrientationLandscapeLeft 
} UIInterfaceOrientation; 

UIDeviceOrientation ti dice cosa l'orientamento del dispositivo è. UIInterfaceOrientation indica quale sia l'orientamento dell'interfaccia e viene utilizzato da UIViewController. UIInterfaceOrientation sarà chiaramente verticale o orizzontale, mentre UIDeviceOrientation può avere valori ambigui (UIDeviceOrientationFaceUp, UIDeviceOrientationFaceDown, UIDeviceOrientationUnknown).

In ogni caso non si dovrebbe tentare di determinare l'orientamento di un UIViewController con [[UIDevice currentDevice] orientation], come non importa quale sia l'orientamento del dispositivo è di proprietà UIViewController interfaceOrientation può essere diverso (ad esempio, se la vostra applicazione non gira al paesaggio affatto [[UIDevice currentDevice] orientation] possibile essere UIDeviceOrientationLandscapeLeft mentre viewController.interfaceOrientation può essere UIInterfaceOrientationPortrait).

Aggiornamento: Come di iOS 8.0, [UIViewController interfaceOrientation] è deprecato. Un'alternativa offerta here è [[UIApplication sharedApplication] statusBarOrientation]. Anche questo restituisce UIInterfaceOrientation.

5

Faccio questo codice scheletro per trattare con ricercati & indesiderati dispositivi orientamenti, nel mio caso voglio ignorare l'UIDeviceOrientationUnknown, UIDeviceOrientationFaceUp e UIDeviceOrientationFaceDown, la memorizzazione nella cache l'ultimo orientamento consentito. Questo codice tratta i dispositivi iPhone e iPad e può essere utile per te.

- (void)modXibFromRotation { 

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    NSString *device = [[UIDevice currentDevice]localizedModel]; 
    UIInterfaceOrientation cachedOrientation = [self interfaceOrientation]; 

    if ([device isEqualToString:@"iPad"]) { 

     if (orientation == UIDeviceOrientationUnknown || 
      orientation == UIDeviceOrientationFaceUp || 
      orientation == UIDeviceOrientationFaceDown) { 

       orientation = (UIDeviceOrientation)cachedOrientation; 
     } 

     if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) { 

      /* Your code */ 
     } 

     if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown) { 

      /* Your code */  
     } 
    } 

    if ([device isEqualToString:@"iPhone"] || [device isEqualToString:@"iPod"]) { 

     if (orientation == UIDeviceOrientationUnknown || 
     orientation == UIDeviceOrientationFaceUp || 
     orientation == UIDeviceOrientationFaceDown) { 

      orientation = (UIDeviceOrientation)cachedOrientation; 
     } 

     if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) { 

      /* Your code */ 
     } 

     if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown) { 

      /* Your code */ 
     } 
    } 
}