2013-08-26 25 views
5

Sto implementando un blocco rotazione programmatico nella mia app simile a quello trovato nell'app Kindle di Amazon: quando il dispositivo viene ruotato, viene visualizzato un pulsante di blocco; premere il pulsante e l'orientamento è bloccato sull'orientamento in cui si trovava l'interfaccia quando il pulsante è stato premuto.Forza iOS ViewController per ruotare sull'orientamento del dispositivo dopo aver sbloccato il blocco di rotazione programmatico

Dopo lo sblocco, mi piacerebbe che l'interfaccia ruoti sull'orientamento corrente del dispositivo. Supponiamo che blocchi la rotazione in verticale, ruoti il ​​dispositivo in orizzontale a sinistra e quindi sblocchi; Mi piacerebbe che l'interfaccia ruoti in orizzontale a sinistra. Ecco il metodo che attiva/disattiva il blocco:

- (IBAction)toggleRotationLock:(UIButton *)sender { 
BOOL rotationLocked = [_defaults boolForKey:@"RotationLocked"]; 
if (rotationLocked) { //unlock rotation 
    [_defaults setBool:NO forKey:@"RotationLocked"]; 
    /* force rotation to current device orientation here? 
    * ... 
    */ 
} else { //lock rotation to current orientation 
    [_defaults setBool:YES forKey:@"RotationLocked"]; 
    [_defaults setInteger:self.interfaceOrientation forKey:@"RotationOrientation"]; 
} 
    [_defaults synchronize]; 
    [self setupRotationLockButton]; 
} 

Un modo per farlo?

risposta

2

Il tasto è 1) salvare l'orientamento corrente ai valori predefiniti dell'utente esattamente come si sta facendo 2) tutto il resto di ciò che è necessario fare è nei metodi sovrascritti dei controller di vista che si desidera bloccare (per iOS 6+ , supportedInterfaceOrientations). Usa le impostazioni predefinite dell'utente salvate per restituire gli orientamenti che ti consentono se sono bloccati o meno.

Quindi chiamare attemptRotationToDeviceOrientation Per comunicare ai controller della vista di richiamare nuovamente i loro metodi e rivalutare la rotazione in cui dovrebbero essere assegnati alla rotazione corrente dei dispositivi.

+0

Grazie, attemptRotationToDeviceOrientation fa il trucco! – dysfunction

0

Questo è come faccio a farlo funzionare, nel caso in cui se qualcuno che viene qui vuole guardare il codice. :)

-(IBAction)lockOrientation:(UIButton*)sender 
{ 
if (orientationLocked) { //Unlock it, "orientationLocked" is a boolean defined in .h 
    orientationLocked = NO; 
    [sender setTitle:@"Unlocked" forState:UIControlStateNormal]; 
} 
else 
{ // Lock it. 

    //Save the orientation value to NSDefaults, can just be int if you prefer. 
    // "defaults" is a NSUserDefaults also defined in .h 

    [defaults setInteger:[[UIApplication sharedApplication] statusBarOrientation] forKey:@"orientation"]; 
    orientationLocked = YES; 
    [sender setTitle:@"Locked" forState:UIControlStateNormal]; 
} 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
if (orientationLocked) { 

    return = [defaults integerForKey:@"orientation"]; 
} 
return UIInterfaceOrientationMaskAllButUpsideDown; 
} 
+0

Questa non è esattamente la domanda che stavo chiedendo - non stavo chiedendo come implementare il blocco della rotazione, cosa che avevo già fatto, stavo chiedendo come ruotare all'orientamento del dispositivo quando il blocco della rotazione è stato sbloccato. Sembra che anche atomk abbia pensato di aver chiesto come fare il tutto, ma ha risposto alla mia domanda reale: il metodo di classe UIViewController attemptRotationToDeviceOrientation era tutto ciò di cui avevo bisogno. – dysfunction