UIViewController roti metode

voturi
17

Ce obiect este responsabil pentru dipatching a UIViewControllerapelurilor metoda de rotație, și anume:

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

Îmi imaginez că este UIApplication(dar poate AppDelegate sau UIWindow).

Următoarea întrebare, este modul în care face obiectul știe care UIViewControllersă vorbească cu?

Cum știe care UIViewControllerare punctul său de vedere ca subview a ferestrei?

Există un mesaj pe care îl puteți trimite sau o proprietate puteți seta (de un obiect) , care stabilește „activă“ UIViewControllerpentru aplicația?

Întrebat 14/02/2009 la 00:50
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
13

Se pare că UIApplicationse expediază un mesaj la controler vizualizare activă.

Dar cum dvs. View Controller exemplu primi aceste mesaje?

Mesajul este transmis la primul aparat de comandă vedere a cărui vedere a fost adăugat la UIWindowinstanță.

Acest lucru se reduce la 3 scenarii de bază:

  1. ViewController a cărei vizualizare este adăugată direct în UIWindow instanță (vizualizare unică app)

  2. Controlorul de navigare într-o aplicație bazată pe de navigare, apoi controlerul de navigare transmite mesajul la punctele de vedere active, controler de vizualizare.

  3. Controlorul bara de tab într-o aplicație bazată pe bara de tab, apoi controlerul bara de tab-ul transmite mai departe mesajul la punctele de vedere active, controler de vizualizare (sau controller-ul de navigare activă).

Problema va avea, este dacă vă construi o aplicație cu mai multe vizualizări, dar NU utilizați un controler de navigare sau controler Tab Bar. Dacă schimb de puncte de vedere și în afară de UIWindowinstanță manual, nu veți primi aceste mesaje în mod fiabil. Acest lucru este similar cu posturi ca acesta: iPhone viewWillAppear nu se declanșează

Doar utiliza convențiile Apple pentru mai multe vizualizări și ai fi bine. Sper că acest lucru economisește o oră sau două

Publicat 19/02/2009 la 05:49
sursa de către utilizator

voturi
4

Cum știe care UIViewController are o vizualizare ca subview a ferestrei?

clasa UIViewController menține o hartă statică între punctele de vedere și controlerele lor vedere. Această hartă este interogată în câteva locuri-cheie din interiorul CocoaTouch. În special, [UIView nextResponder] interogări și returnează controlerul dacă a fost găsit.

Cred că UIWindow face același cautartea cu vedere rădăcină de a ști care controler de a transmite evenimente de rotație a. Va verifica acest data viitoare voi fi în căutarea ceva în dezasamblarea. (Mi-am petrecut ceva timp reverse engineering CocoaTouch pentru a înțelege cum stau lucrurile acolo.)

Publicat 06/05/2009 la 12:15
sursa de către utilizator

voturi
4

Acest lucru este magic Nu vă faceți griji vreodată. Trebuie doar să adăugați vedere rădăcină controlerul la fereastra - sau pentru a obține o bara de tab sau controler de navigare pentru a face acest lucru pentru tine - si va primi aceste mesaje.

(Dar dacă scormoni în jurul cu debugger, s-ar putea ajunge la aceeași concluzie am:. Există un fel de tabel intern de cartografiere vedere din fiecare controler înapoi la controler, iar mesajele sunt expediate pe baza care se leagă)


UPDATE: Acest lucru a fost magie cu adevărat privat în 2009 , când am scris prima dată acest răspuns, dar modificările ulterioare la iOS au făcut API - urile din spatele ei publice. Controlerul de vedere rădăcină este acum accesibil prin UIWindow.rootViewControllerproprietate, iar arborele controlere vizualizare descendent este format folosind UIViewController.childViewControllersproprietatea.

Controlere sunt responsabile afișarea părinte pentru notificarea copiilor lor de schimbări de orientare. (Nu sunt sigur cum este notificat controlerul de vedere rădăcină, dar ați putea stabili un punct de întrerupere și de a afla singur.) Acest -shouldAutomaticallyForwardRotationMethodsMetoda decide dacă UIViewController va face acest lucru pentru tine. Dacă se întoarce NO, va deveni responsabil pentru a face acest lucru în dumneavoastră -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:și -didRotateFromInterfaceOrientation:metode.

Publicat 14/02/2009 la 01:42
sursa de către utilizator

voturi
1

Am o problemă similară.

Am un joc de lucru în orientarea peisaj (atât la stânga și dreapta peisaj).

Pentru a gestiona o aplicație multi-view, am folosi un UIviewController rădăcină, adică un UIViewcontroller fals cu un UIView care nu face nimic. Apoi am adăuga orice alt UIView să-l ca subview.

La pornirea aplicației, emulator se rotește rapid la o orientare portret, și I a lua fiecare dintre opiniile mele cu proprietatea rama sa aratand ca (0, -80320480). Aceasta are ca rezultat vizualizarea fiind tăiate de un dreptunghi de 160 x 320 în partea dreaptă.

Am observat că - shouldAutorotateToInterfaceOrientation: metoda de fiecare subview este numit doar o singură dată, iar acest lucru se întâmplă atunci când se adaugă la vizualizarea rădăcină. Mai târziu, la rotirea dispozitivului, numai punctul de vedere devine rădăcină este metoda numită.

Normal, oricare dintre metodele * - willAnimate apelurile sunt trimise numai la vizualizarea rădăcină, astfel încât, definind oricare dintre aceste metode în subviews este inutilă.

Aceste metode sunt numite de fiecare dată orientarea este schimbat la o orientare acceptată de - shouldAutorotateToInterfaceOrientation: metoda. așa că am gândit că ar putea chnage proprietatea cadru subviews mei de acolo.

Pentru a realiza acest lucru, am definit următoarea metodă din clasa mea 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);
        ...
}

Nu înțeleg de ce proprietatea de cadru nu este actualizat, dar știu că funcționează această soluție.

Sper că acest lucru vă ajută....

Publicat 25/03/2010 la 05:20
sursa de către utilizator

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