2010-04-29 12 views

risposta

8

Se non si desidera ruotare il controller di visualizzazione, è sufficiente ignorare il metodo del controller della vista shouldAutoRotateToInterface per restituire false per qualsiasi orientamento non si desidera supportare ... Here is a reference.

Nel caso in cui u vuole solo per gestire la rotazione qualche altro modo, è possibile restituire falso nei metodi di cui sopra e registrarsi per UIDeviceOrientationDidChangeNotification in questo modo

NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; 
[nc addObserver:self 
     selector:@selector(handleOrientationDidChange:) 
      name:UIDeviceOrientationDidChangeNotification 
     object:nil]; 

Ora, quando u ottenere le notifiche u può fare quello che voglio con esso ...

+2

Penso che lo desideri ancora ruotare ma utilizzare un'animazione diversa o non animata affatto. –

+0

ha cambiato la risposta per riflettere che – Daniel

+0

ha funzionato. –

16

Sì, è possibile disattivare l'animazione, senza rompere tutto a parte.

I seguenti codici disabiliterà l'animazione di rotazione "scatola nera", senza fare confusione con altre animazioni o codice di orientamento:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [UIView setAnimationsEnabled:YES]; 
} 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    [UIView setAnimationsEnabled:NO]; 
    /* Your original orientation booleans*/ 
} 

inserirlo nel vostro UIViewController e tutti dovrebbero essere bene. Lo stesso metodo può essere applicato a qualsiasi animazione indesiderata in iOS.

Buona fortuna con il tuo progetto.

+8

Per iOS 6+ (e precedenti) compatibilità, puoi mettere [UIView setAnimationsEnabled: NO] in willRotateToInterfaceOrientation: duration: invece di shouldAutorotateToInterfaceOrientation: –

+4

Ricorda di chiamare la super implementazione se la sostituisci. In particolare, i documenti Apple dicono che se si esegue l'override di willRotateToInterfaceOrientation: duration: o didRotateFromInterfaceOrientation: "L'implementazione di questo metodo deve chiamare super ad un certo punto durante l'esecuzione." – levigroker

+0

Ecco la versione Swift ... http://stackoverflow.com/a/6292506/294884 – Fattie

0

La risposta di @Nils Munch sopra è trovata per < iOS7. Per iOS 7 o versioni successive è possibile utilizzare:

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [UIView setAnimationsEnabled:NO]; 

    [coordinator notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
     [UIView setAnimationsEnabled:YES]; 
    }]; 

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
} 
+0

Davvero ??? Perché i doc parlano di 8+? –

+0

Questo blocco non viene mai chiamato per me ..... – Kevin

+0

Appena ripetuto nel debugger, con iOS 8.4 e viene definitivamente chiamato quando ruoto il dispositivo. Per PKCLsoft