UIViewController rotere fremgangsmåter

stemmer
17

Hva objekt er ansvarlig for dipatching de UIViewControllerrotasjonsmetodekall, dvs:

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

Jeg antar det er UIApplication(men kanskje AppDelegate eller UIWindow).

Det neste spørsmålet er hvordan objektet vite hvilke UIViewControllerå snakke med?

Hvordan vet den som UIViewControllerhar sitt syn som subview av vinduet?

Er det en melding du kan sende eller en egenskap du kan stille (av noen objekt) som setter Active UIViewControllerfor app?

Publisert på 13/02/2009 klokken 23:50
kilden bruker
På andre språk...                            


4 svar

stemmer
13

Det virker som UIApplicationer utsending en melding til den aktive visningen kontrolleren.

Men hvordan din View Controller eksempel få disse meldingene?

Meldingen blir videresendt til den første visningen kontrolleren som vis er blitt satt til UIWindowforekomsten.

Dette koker ned til 3 grunnleggende scenarier:

  1. Den ViewController hvis vis settes direkte til den UIWindow instans (enkelt vis app)

  2. Navigasjons Controller i et navigasjonsbasert app, deretter navigeringskontrolleren sender meldingen til de aktive visninger vise kontrolleren.

  3. Fanen Stang-styringen i en fanelinjen basert app, deretter kategorien Stang-styringen videresender meldingen til de aktive ganger Se kontroller (eller den aktive navigeringskontroller).

Problemet du vil ha, er hvis du bygger en app med flere visninger, men IKKE bruk en navigasjonskontroller eller Tab Bar kontrolleren. Hvis du bytte utsikt inn og ut av UIWindowforekomsten manuelt, vil du ikke motta disse meldingene pålitelig. Dette ligner på innlegg som dette: iPhone viewWillAppear ikke skyte

Bare bruk Apples konvensjoner for flere visninger, og du blir fin. Håper dette sparer noen en en time eller to

Svarte 19/02/2009 kl. 04:49
kilden bruker

stemmer
4

Hvordan vet det som UIViewController har sitt syn som subview av vinduet?

UIViewController klassen opprettholder et statisk kart mellom synspunkter og deres syn kontrollere. Dette kartet er spørres i noen viktige steder inne CocoaTouch. Spesielt [UIView nextResponder] spør den og returnerer styreenheten hvis det blir funnet.

Jeg antar UIWindow gjør det samme oppslag med roten sikte på å vite hvilke kontroller for å videresende rotasjons hendelser til. Vil sjekke dette neste gang jeg skal se noe opp i demontering. (Jeg har brukt litt tid omvendt utvikling CocoaTouch å forstå hvordan ting fungerer der.)

Svarte 06/05/2009 kl. 11:15
kilden bruker

stemmer
4

Dette er alt magi du ikke bekymre deg over. Bare legg kontrolleren rot utsikt til vinduet - eller få en fanelinjen eller navigeringskontrolleren til å gjøre det for deg - og den vil motta disse meldingene.

(Men hvis du rote rundt med debugger, kan du komme til samme konklusjon jeg har. Det er en slags intern tabell kartlegge hver kontrolleren syn tilbake til kontrolleren, og meldingene sendes basert på denne linken)


Oppdatering: Dette var virkelig privat magi i 2009 da jeg først skrev dette svaret, men senere endringer i iOS har gjort APIene bak det offentlige. Roten syn kontrolleren er nå tilgjengelig gjennom UIWindow.rootViewControlleregenskap, og treet av kommer se styringer er dannet ved hjelp av UIViewController.childViewControllersegenskapen.

Parent view kontrollere er ansvarlig for å varsle sine barn av orienterings endringer. (Jeg er ikke sikker på hvordan roten visningen kontrolleren er varslet, men du kan sette et stoppunkt og finne ut selv.) Den -shouldAutomaticallyForwardRotationMethodsmetoden avgjør om UIViewController vil gjøre dette for deg. Hvis den gir NO, blir du ansvarlig for å gjøre det i dine -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:og -didRotateFromInterfaceOrientation:metoder.

Svarte 14/02/2009 kl. 00:42
kilden bruker

stemmer
1

Jeg har et lignende problem.

Jeg har et spill som arbeider i liggende retning (både venstre og høyre liggende).

For å håndtere en multi-view-programmet jeg bruker en rot UIviewController, dvs. en dummy UIViewcontroller med en UIView som ikke gjør noe. Jeg deretter legge alle andre UIView til det som en subview.

Når du starter programmet, roterer emulator raskt til en stående, og jeg får hver og en av mine synspunkter med sin ramme eiendom ser ut som (0, -80320480). Dette resulterer i at gjenstanden er klippet av en 160 X 320 rektangel på den høyre side.

Jeg har lagt merke til at - shouldAutorotateToInterfaceOrientation: metode for hver subview bare kalles en gang, og det skjer når det er lagt til roten visning. Senere, når du roterer enheten, bare roten visningen blir det metode kalt.

Ikke overraskende hvilket som helst av de - er willAnimate * Metode anrop bare sendes til roten vis, så som definerer en hvilken som helst av disse metodene i subviews er meningsløs.

Disse metodene er kalt hver gang retningen endres til en orientering akseptert av - shouldAutorotateToInterfaceOrientation: metode. så jeg tenkte jeg kunne chnage mine subviews' ramme eiendom derfra.

For å oppnå dette, definert jeg følgende metode i min rootViewController klasse:

- (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);
        ...
}

Jeg forstår ikke hvorfor rammen eiendommen ikke er oppdatert, men jeg vet at denne løsningen fungerer.

Håper dette hjelper....

Svarte 25/03/2010 kl. 04:20
kilden bruker

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