UIViewController forgatni módszerek

szavazat
17

Milyen tárgy felelős dipatching a UIViewControllerrotációs módszert hívások, azaz:

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

Gondolom ez UIApplication(de talán a AppDelegate vagy UIWindow).

A következő kérdés az, hogy hogyan működik a tárgy, hogy melyik UIViewControllerbeszélni?

Hogyan tudja, hogy melyik UIViewControllervan a néző, mint a subview az ablakon?

Van egy üzenetet küldhet, vagy egy tulajdonság megadható (néhány tárgy), amely meghatározza az „aktív” UIViewControlleraz app?

A kérdést 14/02/2009 00:50
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
13

Úgy tűnik, hogy UIApplicationa diszpécser egy üzenetet az aktív nézetvezérlőben.

De hogyan a nézet Controller fokon, hogy ezeket az üzeneteket?

A üzenetet továbbítjuk az első nézetvezérlőben amelynek nézetet adunk a UIWindowpéldány.

Ez csapódik le, hogy 3 alapvető módja:

  1. A ViewController amelynek nézet adunk közvetlenül a UIWindow példány (egyetlen nézetben app)

  2. A navigációs vezérlő egy navigációs alapú alkalmazást, majd a navigációs vezérlő továbbítja az üzenetet az aktív megtekintés vezérlő.

  3. Fülsáv Controller egy lapon bar alapú alkalmazást, majd a lap bár vezérlő továbbítja az üzenetet az aktív megtekintés vezérlő (vagy az aktív navigációs vezérlő).

A probléma akkor van, ha építsenek egy alkalmazás több nézeteit, de nem használja a navigációs vezérlő vagy Tab Bar vezérlő. Ha cserélni álláspontjukat, és ki a UIWindowfokon kézzel, akkor nem kapja ezeket az üzeneteket megbízhatóan. Ez hasonló munkakörbe, mint ez: iPhone viewWillAppear nem gyújt

Csak használja az Apple egyezmények több nézetet és akkor minden rendben lesz. Remélem, ez ment valaki egy vagy két óra

Válaszolt 19/02/2009 05:49
a forrás felhasználó

szavazat
4

Hogyan tudja, hogy melyik UIViewController létesítő nézetet a subview az ablakon?

UIViewController osztály fenntartja a statikus térkép nézetek közötti és azok nézet vezérlők. Ez a térkép lekérdezett néhány kulcsfontosságú helyeken belül CocoaTouch. Különösen [UIView nextResponder] lekérdezi, és visszatér a vezérlőt, ha talált.

Azt hiszem UIWindow ugyanazt lookup annak gyökérnézetéhez tudni, hogy melyik vezérlő hogy továbbítsa forgatás események. Ellenőrizni fogja ezt a következő alkalommal fogok keresni valamit a szétszerelés. (Töltöttem egy kis időt fordított mérnöki CocoaTouch megérteni, hogyan működnek a dolgok ott.)

Válaszolt 06/05/2009 12:15
a forrás felhasználó

szavazat
4

Ez az összes Magic Te soha ne aggódni. Csak add meg a vezérlő gyökérnézetéhez az ablak -, vagy kap egy lapot, vagy a Navigációs vezérlőt csinálni az Ön számára - és meg fogja kapni ezeket az üzeneteket.

(De ha piszkálni körül a debugger, akkor jöhet ugyanarra a következtetésre van: van valami belső asztal feltérképezése minden vezérlő nézet vissza a vezérlő, és az üzenetek feladják alapuló linkre.)


Frissítés: Ez valóban saját mágikus 2009-ben, amikor először írtam ezt a választ, de a későbbi változtatásokat iOS tettek az API-k mögött nyilvánosságra. A gyökér nézetvezérlőben most keresztül elérhető a UIWindow.rootViewControllertulajdonság, és a fa a leszármazott nézet vezérlők alkalmazásával van kialakítva a UIViewController.childViewControllerstulajdonság.

Szülőnézetre vezérlők köteles értesíteni a gyermekek tájékozódási változásokat. (Nem vagyok biztos benne, hogy a gyökér nézetvezérlőben bejelentették, de megadhat egy töréspontot, és megtudja magát.) Az -shouldAutomaticallyForwardRotationMethodseljárás dönti el, hogy UIViewController fogja ezt az Ön számára. Ha visszatér NO, akkor lesz az ezért felelős az -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:és -didRotateFromInterfaceOrientation:módszereket.

Válaszolt 14/02/2009 01:42
a forrás felhasználó

szavazat
1

Van egy hasonló probléma.

Van egy játék dolgozó fekvő helyzetben (jobb és bal táj).

Annak érdekében, hogy kezelni egy multi-view alkalmazás azt használja a gyökér UIviewController, azaz hatóanyag nélküli UIViewcontroller egy UIview hogy nem csinál semmit. Aztán hozzá minden UIview rá, mint egy subview.

Indításakor az alkalmazás, az emulátor gyorsan forog, hogy a tájolása, és én kap minden az én egyik nézetek vele frame tulajdonság néz ki, mint a (0, -80320480). Ez eredményezi a nézetet felklippeljük egy 160 X 320 téglalap a jobb oldalon.

Úgy vettem észre, hogy a - shouldAutorotateToInterfaceOrientation: eljárás egyes subview csak egyszer hívja, és akkor történik, ha hozzáadjuk a gyökér kilátás. Később, amikor a készülék forgatása csak gyökérnézetéhez kap ez a módszer az úgynevezett.

Nem meglepő, hogy az egyik a - willAnimate * módszerek hívások csak akkor küldi el a gyökér nézet, így meghatározó az ilyen eljárásokban a subviews értelmetlen.

Ezeket a módszereket nevezzük everytime a tájolás változik orientációs által elfogadott - shouldAutorotateToInterfaceOrientation: módszer. így gondoltam én is chnage én subviews' frame tulajdonság onnan.

Hogy ezt, megadtam a következő módszerrel én rootViewController osztály:

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

Nem értem, hogy miért a keret tulajdonság nem frissül, de tudom, hogy ez a megoldás működik.

Remélem ez segít....

Válaszolt 25/03/2010 05:20
a forrás felhasználó

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