7

Questa è un'osservazione più che altro, perché mi sembra di aver trovato un work-around ...[UIDevice currentDevice] .orientation == UIDeviceOrientationUnknown seguente UINavigationController spingere

Il codice qui sotto non funziona quando è in un controller che è stato inserito in uno stack UINavigationController. In questa situazione [UIDevice currentDevice].orientation restituisce costantemente UIDeviceOrientationUnknown.

-(void)layoutAccordingToOrientation { 
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; 
    NSLog(@"layoutAccordingToOrientation/orientation==%i", orientation); 
    if (UIInterfaceOrientationIsLandscape(orientation)) { 
     : 
     _detailToolbar.frame = CGRectMake(0, 660, 1024, 44); 
    } else { 
     : 
     _detailToolbar.frame = CGRectMake(0, 916, 768, 44); 
    } 
} 

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self layoutAccordingToOrientation]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

la seguente chiamata è stato fatto:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

Per aggirare il UIDeviceOrientationUnknown -problema, io uso il seguente invece:

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
if (UIInterfaceOrientationIsLandscape(orientation)) { 
    etc. 
} else { 
    etc. 
} 

... che funziona ogni volta.

Ancora, non riesco a capire perché la prima variante non funzionerebbe nel contesto di un controller di visualizzazione spinto. Idee a qualcuno? È semplicemente un insetto?

+0

Ho lo stesso problema, tuttavia non sono in grado di far funzionare il lavoro anche nella mia situazione. – Flea

risposta

3

mi veniva in mente un paio di cose qui, ma non sono sicuro che siano quello che stai cercando ...

In primo luogo, quando l'applicazione viene avviata, di solito l'orientamento del dispositivo restituisce UIDeviceOrientationUnknown per motivi di prestazioni. Una cosa che potresti provare è quella di impaginare le tue subview in un .nib o nella tua Storyboard, con le corrette opzioni di autoresizzazione, e lasciare che iOS faccia il suo dovere.

In secondo luogo, se sei come me, forse stai provando su un dispositivo che è proprio accanto al tuo computer, appoggiato su un tavolo. Bene, in questo caso, sei non andando a prendere la cosa UIDeviceOrientationUnknown. Dovresti testare effettivamente per UIDeviceOrientationIsValidInterfaceOrientation([[UIDevice currentDevice] orientation]). Ad esempio, se il dispositivo si trova sul dorso, restituisce sì a tale affermazione. Ciò significa anche che quando si utilizza UIInterfaceOrientationIsLandscape(orientation), si ottiene il risultato corretto per il motivo errato. UIInterfaceOrientationIsLandscape restituisce false non perché l'orientamento del dispositivo è UIDeviceOrientationPortrait, ma perché non è valido.

Non sono sicuro se questo ha aiutato, ma mi ci è voluto un po 'per capirlo e ho pensato che sarebbe stato bello condividere queste informazioni! :)