2013-01-17 17 views
14

Se ho un puntatore a un UIViewController, posso ricevere una notifica quando cambia interfacciaOrientation senza modificare il codice del controller?Posso osservare quando un UIViewController cambia interfacciaOrientation?

È la mia migliore scommessa per rilevare le modifiche nell'orientamento del dispositivo e quindi vedere se UIViewController avrà/avrà ruotato (d)?

+0

non è sicuro se la questione è ancora attuale, ma è possibile utilizzare il metodo objc swizzling per aggiungere il proprio codice nel codice 'del UIViewController'. Dovrebbe sembrare scambiare '-didRotateFromInterfaceOrientation:' con la tua implementazione che ha una chiamata al tuo metodo di gestione dell'orientamento modificato e una chiamata all'implementazione originale – medvedNick

+0

@medvedNick Sembra ragionevole. Potrei chiamare il mio delegato, quindi chiamare l'implementazione originale. Potrei essere un po 'preoccupato per i potenziali effetti collaterali. –

risposta

16

È possibile utilizzare NSNotificationCenter:

[[NSNotificationCenter defaultCenter] addObserver:self // put here the view controller which has to be notified 
             selector:@selector(orientationChanged:) 
              name:@"UIDeviceOrientationDidChangeNotification" 
              object:nil]; 
- (void)orientationChanged:(NSNotification *)notification{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

    //do stuff 
    NSLog(@"Orientation changed");   
} 
+3

Hmm. Penso di non essere stato chiaro. Voglio conoscere l'orientamento apparente di un ViewController piuttosto che il dispositivo. In altre parole, il mio oggetto desidera osservare un controller della vista per vedere il suo orientamento, che potrebbe essere diverso da quello del dispositivo e che potrebbe non cambiare quando il dispositivo cambia orientamento. Questa risposta è parte di ciò che stavo insinuando nella seconda parte della mia domanda. –

2

È possibile utilizzare il metodo willAnimateRotationToInterfaceOrientation:duration: sul UIViewController e poi riposizionare eventuali UIViews (o qualsiasi altro codice) per orizzontale o verticale. Per esempio.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
    // change positions etc of any UIViews for Landscape 
    } else { 
    // change position etc for Portait 
    } 

    // forward the rotation to any child view controllers if required 
    [self.rootViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 
+1

Sfortunatamente ciò significherebbe cambiare il codice di UIViewController. Qui ho solo un puntatore e voglio osservare il suo comportamento. Quello che mi piacerebbe davvero fare è ricevere una notifica quando "interfaceOrientation" restituisce un valore diverso. –

+0

NB: deprecato in iOS 8. http://stackoverflow.com/questions/25238620/ios-8-rotation-methods-deprecation-backwards-compatibility – jowie

Problemi correlati