UIViewController otáčet metody

hlasů
17

Jaký objekt je zodpovědný za dipatching na UIViewControllervolání metod rotace, tedy:

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

Dovedu si představit, že je UIApplication(ale možná AppDelegate nebo UIWindow).

Další otázkou je, jak se objekt vědět, které UIViewControllermluvit?

Jak to víte, které UIViewControllermá svůj názor, jako subview okna?

Existuje zpráva, kterou lze odeslat nebo vlastnost lze nastavit (z nějakého předmětu), která nastaví „Active“ UIViewControllerpro aplikaci?

Položena 14/02/2009 v 00:50
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
13

Zdá se, že UIApplicationje dispečink zprávu aktivní kontroleru pohledu.

Ale jak se vaše View Controller instance si tyto zprávy?

Zpráva je předána na první pohled regulátoru, jehož pohled byl přidán do UIWindowinstance.

To se scvrkává na 3 základní scénáře:

  1. ViewController jehož pohled se přidává přímo do UIWindow instance (single pohled app)

  2. Navigační Controller v aplikaci Navigation bázi, pak navigační řadič předává zprávu na aktivní zobrazení zobrazení řadič.

  3. Karta bar Controller v aplikaci liště bázi, pak regulátor liště předává zprávu na aktivní zobrazení zobrazení řadič (nebo aktivní navigační řadič).

Problém budete mít, je, pokud vytvořit aplikaci s několika pohledy, ale nepoužívejte řadič navigační nebo řídicí liště. Máte-li vyměnit pohledy dovnitř a ven z UIWindowinstance ručně, nebudete dostávat tyto zprávy spolehlivě. Je to podobné jako na pracovní místa, jako je tento: iPhone viewWillAppear nespouští

Stačí použít Apple konvence pro více pohledů a budete v pořádku. Doufám, že to ušetří někdo hodinu nebo dvě

Odpovězeno 19/02/2009 v 05:49
zdroj uživatelem

hlasů
4

Jak to víte, které UIViewController má svůj názor, jako subview okna?

UIViewController třída udržuje statické mapování mezi názory a jejich pohledu regulátorů. Tato mapa je dotázána v několika klíčových místech uvnitř CocoaTouch. Zejména [UIView nextResponder] dotazuje ho a vrátí regulátor v případě nálezu.

Myslím UIWindow dělá stejnou vyhledávání s kořenovou cílem vědět, které řídicí jednotka, aby předal rotace události. Bude kontrolovat tento příště budu hledat něco nahoru do demontáže. (Jsem strávil nějaký čas reverzní inženýrství CocoaTouch pochopit, jak věci fungují zde.)

Odpovězeno 06/05/2009 v 12:15
zdroj uživatelem

hlasů
4

To vše je Magie You Do not Ever obávat. Stačí přidat kořenový pohled řadiči k oknu - nebo si liště nebo navigační ovladač, aby to pro vás - a to bude přijímat tyto zprávy.

(Ale pokud jste v kurzu porozhlédnout s ladicí program, můžete přijít ke stejnému závěru jsem měl:. Je tu jakýsi vnitřní tabulka mapující názor každý řadič zpět do řídicí jednotky, a jsou zprávy odesílané na základě tohoto odkazu)


Aktualizovat: To bylo opravdu soukromý magie v roce 2009, kdy jsem poprvé psal tuto odpověď, ale následné změny iOS dělali API za ním veřejnost. Regulátor kořen pohled je nyní přístupný přes UIWindow.rootViewControllervlastnost, a strom potomků regulátorů pohledu je vytvořen s použitím UIViewController.childViewControllersmajetku.

Mateřské regulátory pohled jsou zodpovědné za informování svých dětí změn orientace. (Nejsem si jistý, jak je regulátor kořen pohled oznámen, ale je možné nastavit zarážku a zjistit sami.) Tento -shouldAutomaticallyForwardRotationMethodszpůsob rozhodne, zda UIViewController to udělá za vás. Pokud se vrátí NO, stanete se zodpovědný za to ve vašich -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:a -didRotateFromInterfaceOrientation:metod.

Odpovězeno 14/02/2009 v 01:42
zdroj uživatelem

hlasů
1

Mám podobný problém.

Mám hra pracující v orientaci na šířku (levé i pravé krajiny).

Za účelem řízení aplikace multi-view I použít kořenový UIviewController, tedy fiktivní UIViewcontroller s UIView který nedělá nic. pak přidám každý druhý UIView k němu jako subview.

Při spuštění aplikace, emulátor rychle otáčí na orientaci na výšku, a jsem si každý jeden z mých názorů to s rámem vlastnost vypadá jako (0, -80,320,480). To má za následek zobrazení je oříznut na 160 X 320 obdélníku na pravé straně.

Všiml jsem si, že - shouldAutorotateToInterfaceOrientation: metoda každého subview se nazývá pouze jednou, a to se stane, když se přidává do zobrazení root. Později, při otáčení přístroje, pouze zobrazení kořenové dostane to je metoda volána.

Není překvapením, že některý z - willAnimate * metody volání jsou zasílány pouze na zobrazení kořenové, takže definuje některé z těchto metod v subviews je zbytečné.

Tyto metody se nazývají pokaždé orientace se změní na orientaci akceptovaném - shouldAutorotateToInterfaceOrientation: metoda. Tak jsem mohl chnage frame vlastnictví mých subviews' odtamtud.

K dosažení tohoto cíle, je definováno I následující metodu v mém rootViewController třída:

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

Nechápu, proč se daná nemovitost rám není aktualizován, ale vím, že toto řešení funguje.

Snad to pomůže....

Odpovězeno 25/03/2010 v 05:20
zdroj uživatelem

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