2009-05-30 3 views
12

Ho il seguente codice in un metodo. Quando eseguo questo nel simulatore il debugger salta sopra il codice ?? Cosa mi manca?UIDevice Orientation

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

} else { 

} 
+0

Vuoi dire che salta sopra il se e il resto, o che va sempre alla altro? –

+0

Sì, ci sono dati nel se e altro; e sì salta l'intera faccenda. – Jordan

+0

Forse aiuta http://stackoverflow.com/q/634745/194544 – beryllium

risposta

18

Update 2

Questo non dovrebbe importare, ma cercare attivando le notifiche di orientamento:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 


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

Aggiornamento

Il mio male, ho pensato che era vuoto.

Provare a rimuovere l'istruzione o e testare solo per un orientamento singolo. Vedi se lo risolve. Forse c'è un problema di parentesi o qualcosa di stupido.

Ho il seguente test di lavoro nel codice di produzione, in modo dalla vostra tecnica dovrebbe funzionare:

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


} 

risposta originale

Bisogna effettivamente messo dichiarazioni in se blocchi per farlo step in.

Il debugger è abbastanza intelligente da saltare blocchi vuoti.

+0

Sì, ci sono i dati in if e else; e sì salta l'intera faccenda. – Jordan

+0

Grazie. Mi è sfuggito un problema di parentesi stupide. Eccezionale. – Jordan

23

Nota che c'è una macro UIDeviceOrientationIsLandscape e UIDeviceOrientationIsPortrait, così invece di confrontare separatamente per LandscapeLeft e LandscapeRight si può solo fare in questo modo:

if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) 
{ 
} 
+0

problema in iOS 6 –

+0

quale problema? .. – inkredibl

53

Il modo migliore per determinare l'orientamento interfaccia è quello di esaminare lo stato bar orientamento:

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 

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

     //Portrait orientation 

} 

if(orientation == UIInterfaceOrientationLandscapeRight || 
    orientation == UIInterfaceOrientationLandscapeLeft) { 

    //Landscape orientation 

} 

misure classe orientamento basato su accelerometro e se il dispositivo adagiata, non restituirà l'orientamento corretto.

+7

si dovrebbe accettare questa risposta .... – harshalb

+0

Grazie per questo.Ha salvato la mia giornata !! – virata

+0

'UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];' combinata con 'UIDeviceOrientationIsLandscape' e' UIDeviceOrientationIsPortait' è la strada da percorrere. – Joe

0

E 'necessario chiamare il numero [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications] prima di ottenere il valore. Dai un'occhiata alla documentazione di questo metodo. Mi ci è voluto un po 'per rintracciarlo.

2

Un altro modo di fare questo senza accendere l'orientamento di notifica potrebbe essere quella di

Fase 1: Salva l'orientamento corrente in una variabile locale myCurrentOrientation e assegnare così:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration 
{ 
    myCurrentOrientation = toInterfaceOrientation; 
} 

Passo 2: Utilizzare myCurrentOrientation per il controllo

if (UIInterfaceOrientationIsLandscape(myCurrentOrientation) == YES) { 
    // landscape 
} 
else { 
    // portrait. 
} 
+0

Buon consiglio. Ma attenzione che questo codice non viene chiamato quando l'utente cambia orientamento in un'altra vista e torna qui. Soluzione alternativa aggiungendo questo in un metodo conveniente: myCurrentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; – FeltMarker

0

dicono che sei all'interno di un tweak Springboard e vuole mostrare qualcosa a seconda dell'orientamento delle app corrente, quindi è possibile utilizzare questo (jailbreak solo):

UIInterfaceOrientation o = [[UIApplication sharedApplication] _frontMostAppOrientation]; 
0

vi consiglio di utilizzare il mio codice evidenziato al posto del tuo per mettere in sicurezza un certo numero di righe.

-(void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self rotations]; 
} 

-(void)rotations 
{ 
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(orientationChanged:) 
             name:UIDeviceOrientationDidChangeNotification 
             object:nil]; 
} 

-(void) orientationChanged:(NSNotification *)notification 
{ 
    //USE THIS PART 
    //USE THIS PART 
    //USE THIS PART 
    //USE THIS PART 
    //USE THIS PART 
    if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) 
    { 
    } 
} 

INVECE DI

if([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortrait || 
    [[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortraitUpsideDown) 
{ 
} 
0

Ecco un metodo per trovare l'orientamento e il vero centro dello schermo. Ho usato il metodo di Tuszy in modo da poter impostare UIActivityIndicatorView correttamente.

- (BOOL) isPortraitOrientation { 
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    if(orientation == UIInterfaceOrientationPortrait || 
     orientation == UIInterfaceOrientationPortraitUpsideDown) { 
     return true; 
    } 
    if(orientation == UIInterfaceOrientationLandscapeRight || 
     orientation == UIInterfaceOrientationLandscapeLeft) { 
     return false; 
    } 
    return false; 
} 

E il modo per ottenere il centro ...

- (void) findMyUIViewCenter { 
    CGPoint myCenter; 
    if ([self isPortraitOrientation]) { 
     myCenter = self.view.center; 
    } 
    else { 
     myCenter = CGPointMake(self.view.frame.size.height/2.0, self.view.frame.size.width/2.0); 
    } 
    NSLog(@"true center -- x:%f y:%f)",myCenter.x,myCenter.y); 
}