UIViewController ruotare metodi

voti
17

Quale oggetto è responsabile dipatching le UIViewControllerchiamate di metodo di rotazione, vale a dire:

  • shouldAutorotateToInterfaceOrientation:
  • willRotateToInterfaceOrientation:duration:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:

Immagino che sia UIApplication(ma forse l'AppDelegate o UIWindow).

La domanda successiva, è come fa l'oggetto che sa UIViewControllerparlare?

Come si sa, che UIViewControllerha la sua vista, come la visualizzazione secondaria della finestra?

C'è un messaggio è possibile inviare o una proprietà è possibile impostare (di un oggetto) che imposta il Active UIViewControllerper l'applicazione?

È pubblicato 14/02/2009 alle 00:50
fonte dall'utente
In altre lingue...                            


4 risposte

voti
13

Sembra che UIApplicationsta inviando un messaggio al controller della vista attiva.

Ma come fa il vostro View esempio controller ottenere questi messaggi?

Il messaggio viene inoltrato al primo controller di vista la cui visione è stata aggiunta alla UIWindowistanza.

Questo si riduce a 3 scenari di base:

  1. Il ViewController cui visione viene aggiunto direttamente al UIWindow caso (visualizzazione singola applicazione)

  2. Il controller di navigazione in un'applicazione basata navigazione, quindi il controller di navigazione inoltra il messaggio alle opinioni attivi View Controller.

  3. Il controller barra delle schede in un'applicazione basata scheda bar, poi il controller barra delle schede inoltra il messaggio alle opinioni attivi View Controller (o il controller di navigazione attivo).

Il problema si avrà, è se costruire un app con molteplici punti di vista, ma non si utilizza un controller di navigazione o il controller Tab Bar. Se si scambiano opinioni in e fuori del UIWindowcaso manualmente, non sarà possibile ricevere questi messaggi in modo affidabile. Questo è simile a posti come questo: iPhone viewWillAppear non sparare

Basta usare le convenzioni di Apple per più punti di vista e si andrà bene. Spero che questo consente di risparmiare qualcuno una o due ore

Risposto il 19/02/2009 a 05:49
fonte dall'utente

voti
4

Come fa a sapere che UIViewController ha la sua vista, come la visualizzazione secondaria della finestra?

Classe UIViewController mantiene una mappa statica tra i punti di vista e le loro controller di vista. Questa mappa viene interrogato in alcuni posti chiave all'interno Cocoa Touch. In particolare, [UIView nextResponder] interroga e restituisce il controller se trovato.

Credo UIWindow fa la stessa ricerca con vista radice sapere quale controller di trasmettere eventi di rotazione a. Verificherà la prossima volta cercherò qualcosa nel smontaggio. (Ho trascorso qualche tempo Cocoa Touch reverse-engineering per capire come funzionano le cose lì.)

Risposto il 06/05/2009 a 12:15
fonte dall'utente

voti
4

Questa è tutta la magia Non è mai preoccuparsi. Basta aggiungere vista radice del controller alla finestra - o ottenere una barra delle schede o controller di navigazione di farlo per voi - e che riceverà questi messaggi.

(Ma se si frugare con il debugger, si potrebbe venire alla stessa conclusione che ho:. C'è una sorta di tabella interna mappatura punto di vista di ogni controllore al controller, ei messaggi vengono inviati basano su quel link)


Aggiornamento: Questa è stata la magia veramente privata nel 2009, quando ho scritto questa risposta, ma le successive modifiche iOS hanno reso le API dietro di esso pubblico. Il controller di vista principale è ora accessibile attraverso la UIWindow.rootViewControllerstruttura, e l'albero di controller di vista discendente è formato utilizzando la UIViewController.childViewControllersstruttura.

Controllori vista primaria sono responsabili per notificare i loro figli di cambiamenti di orientamento. (Io non sono sicuro di come il controller della vista radice viene notificato, ma è possibile impostare un punto di interruzione e scoprire da soli.) Il -shouldAutomaticallyForwardRotationMethodsmetodo decide se UIViewController farà questo per voi. Se ritorna NO, si diventa responsabile per farlo nei vostri -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:e -didRotateFromInterfaceOrientation:metodi.

Risposto il 14/02/2009 a 01:42
fonte dall'utente

voti
1

Ho un problema simile.

Ho un gioco di lavoro con orientamento orizzontale (sia a sinistra che a destra del paesaggio).

Per gestire un'applicazione multi-view uso un UIViewController radice, cioè un UIViewController fittizio con un UIView che non fa nulla. Ho quindi aggiungere tutti gli altri UIView ad esso come una visualizzazione secondaria.

Quando si avvia l'applicazione, l'emulatore ruota rapidamente a un orientamento verticale, e ottengo ognuno dei miei punti di vista con esso è di proprietà telaio guardando come (0, -80.320.480). Ciò risulta nella vista essendo ritagliati da un rettangolo 160 X 320 sul lato destro.

Ho notato che il - shouldAutorotateToInterfaceOrientation: Metodo di ciascuna sottomaschera viene chiamato solo una volta, e che accade quando viene aggiunto alla visualizzazione principale. Successivamente, quando si ruota il dispositivo, solo la vista radice prende il suo metodo chiamato.

Non sorprende, uno qualsiasi dei metodi - willAnimate * chiamate sono trasmessi soltanto alla vista radice, quindi, definendo uno di questi metodi in subviews è inutile.

Questi metodi sono chiamati ogni volta che l'orientamento è cambiato in un orientamento accettato dal - shouldAutorotateToInterfaceOrientation: metodo. così ho pensato che avrei potuto chnage proprietà telaio miei subviews' da lì.

Per fare questo, ho definito il seguente metodo nella mia classe RootViewController:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
        ...
}

Non capisco il motivo per cui la proprietà telaio non è aggiornato, ma so che questa soluzione funziona.

Spero che questo ti aiuti....

Risposto il 25/03/2010 a 05:20
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more