UIViewController draaien methoden

stemmen
17

Wat object is verantwoordelijk voor dipatching de UIViewControllerrotatie methode oproepen, te weten:

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

Ik kan me voorstellen dat is UIApplication(maar misschien de AppDelegate of UIWindow).

De volgende vraag is hoe het voorwerp weet welke UIViewControllerom mee te praten?

Hoe werkt het weten welke UIViewControllerhaar standpunt als subweergave van het raam heeft?

Is er een bericht dat u kunt verzenden of een woning die u kunt instellen (van een voorwerp) dat stelt de actieve UIViewControllervoor de app?

De vraag is gesteld op 14/02/2009 om 00:50
bron van user
In andere talen...                            


4 antwoorden

stemmen
13

Leek UIApplicationis het zenden van een bericht naar de actieve view controller.

Maar hoe je View Controller Zo krijgen deze berichten?

Het bericht wordt doorgezonden naar de eerste weergave regelaar, waarvan is toegevoegd, aan de UIWindowinstantie.

Dit komt neer op 3 basis scenario:

  1. De ViewController wiens oog wordt direct toegevoegd aan de UIWindow instantie (enkele weergave app)

  2. De navigatie controller in een navigatie app en de navigatie controller stuurt het bericht naar de actieve manieren weergeven controller.

  3. De tabbalk controller in een tabbladbalk gebaseerde applicatie, wordt de tabbalk controller stuurt het bericht naar de actieve manieren weergeven controller (of actieve navigatie controller).

Het probleem dat u zal hebben, is als je een app met meerdere weergaven te bouwen, maar geen gebruik maken van een Navigation controller of Tab Bar controller. Als je wisselen standpunten in en uit de UIWindowinstantie met de hand, zult u deze berichten niet op betrouwbare wijze te ontvangen. Dit is vergelijkbaar met posten zoals deze: iPhone viewWillAppear niet schieten

Gebruik gewoon Apple's conventies voor meerdere weergaven en u prima. Hoop dat dit bespaart wat men een uur of twee

antwoordde op 19/02/2009 om 05:49
bron van user

stemmen
4

Hoe werkt het weten welke UIViewController heeft zijn oog als subweergave van het raam?

UIViewController klasse onderhoudt een vaste kaart tussen opvattingen en hun visie controllers. Deze kaart is opgevraagd in een paar belangrijke plaatsen binnen CocoaTouch. Vooral [UIView nextResponder] vraagt ​​het en keert de regelaar indien gevonden.

Ik denk UIWindow doet hetzelfde lookup met zijn wortel te weten welke controller draaiing gebeurtenissen doorschakelen. Zal dit de volgende keer dat ik iets op zoek in de demontage te controleren. (Ik heb wat tijd reverse engineering CocoaTouch om te begrijpen hoe de dingen werken er doorgebracht.)

antwoordde op 06/05/2009 om 12:15
bron van user

stemmen
4

Dit is allemaal Magic You Do not Ever zorgen over. Voeg enkel uw controller wortel oog op het raam - of krijgen een tab bar of navigatie controller om het te doen voor u - en het zal deze berichten te ontvangen.

(Maar als je rond te porren met de debugger, kunt u komen tot dezelfde conclusie die ik heb. Er is een soort van interne tabeltoewijzing uitzicht elke controller terug naar de controller, en de berichten worden verzonden op basis van die link)


Update: Dit was werkelijk een eigen magie in 2009 toen ik voor het eerst dit antwoord schreef, maar latere wijzigingen in iOS hebben de API's erachter openbaar gemaakt. De wortel view controller is nu toegankelijk via de UIWindow.rootViewControllereigenschap en de structuur van afstammeling weergeven controllers gevormd met de UIViewController.childViewControllerseigenschap.

Parent view controllers zijn verantwoordelijk voor de kennisgeving van hun kinderen van oriëntatie verandert. (Ik ben niet zeker hoe de wortel view controller wordt gemeld, maar je kon een breekpunt en ontdek het zelf.) De -shouldAutomaticallyForwardRotationMethodsmethode bepaalt of UIViewController dit voor u zal doen. Als hij terugkeert NO, die verantwoordelijk is om dit te doen in uw word je -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:en -didRotateFromInterfaceOrientation:methoden.

antwoordde op 14/02/2009 om 01:42
bron van user

stemmen
1

Ik heb een soortgelijk probleem.

Ik heb een spel werken in liggende stand (zowel links als rechts landschap).

Om een ​​multi-view toepassing gebruik ik een wortel UIViewController beheren, dat wil zeggen een dummy UIViewController met een UIView dat niets doet. Ik voeg dan elke andere UIView om het als een subweergave.

Bij het starten van de app, de emulator draait snel naar een staand, en ik krijg een ieder van mijn standpunten met zijn frame van onroerend goed uitzien als (0, -80.320.480). Dit resulteert in het oog uitgeknipt door een 160 x 320 rechthoek aan de rechterzijde.

Ik heb gemerkt dat de - shouldAutorotateToInterfaceOrientation: methode van elk subview wordt slechts een keer genoemd, en dat gebeurt wanneer het wordt toegevoegd aan de wortel uitzicht. Later, wanneer het draaien van de inrichting, alleen de root weergave krijgt zijn methode genaamd.

Uiteraard, elk van de - * willAnimate methoden oproepen alleen naar de wortel bekijken, zodat, definieert elk van deze werkwijzen subviews zinloos.

Deze werkwijzen worden opgeroepen telkens de oriëntatie wordt gewijzigd naar een oriëntatie van de aanvaarde - shouldAutorotateToInterfaceOrientation: methode. dus ik dacht dat ik kon kader pand mijn subviews' vanaf daar chnage.

Om dit te bereiken, ik definieerde de volgende methode in mijn rootViewController klas:

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

Ik begrijp niet waarom de eigenschap frame niet bijgewerkt, maar ik weet dat deze oplossing werkt.

Ik hoop dat dit helpt....

antwoordde op 25/03/2010 om 05:20
bron van user

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