UIViewController rotation méthodes

voix
17

Quel objet est responsable de dipatching la UIViewControllerméthode rotation des appels, à savoir:

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

J'imagine qu'il est UIApplication(mais peut - être le AppDelegate ou UIWindow).

La question suivante, est de savoir comment l'objet sait qui UIViewControllerparler?

Comment ça ne sait qui UIViewControllera son point de vue que la sous - vue de la fenêtre?

Y at - il un message que vous pouvez envoyer ou une propriété que vous pouvez définir (d'un objet) qui définit le « actif » UIViewControllerpour l'application?

Créé 14/02/2009 à 00:50
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
13

Il semble que UIApplicationest l' envoi d' un message au contrôleur de vue actif.

Mais comment votre instance de View Controller obtenir ces messages?

Le message est transmis au premier contrôleur de vue dont la vue a été ajouté à l' UIWindowinstance.

Cela se résume à 3 scénarios de base:

  1. Le ViewController dont la vue est ajouté directement à l' UIWindow instance (application de vue unique)

  2. Le contrôleur de navigation dans une application de navigation à, le contrôleur de navigation transmet le message aux vues actives voir contrôleur.

  3. Le contrôleur de barre d'onglet dans une application basée barre d'onglet, le contrôleur de barre d'onglet transmet le message aux vues actives View Controller (ou le contrôleur de navigation actif).

Le problème que vous aurez, si vous construisez est une application avec plusieurs vues, mais ne pas utiliser un contrôleur de navigation ou contrôleur barre d' onglets. Si vous échanger des vues dans et hors de l' UIWindowinstance, vous ne recevrez pas manuellement ces messages de manière fiable. Ceci est similaire à des postes comme celui - ci: iPhone viewWillAppear pas de tir

Il suffit d'utiliser les conventions d'Apple pour plusieurs vues et vous serez bien. Espérons que cela sauve quelqu'un d'une heure ou deux

Créé 19/02/2009 à 05:49
source utilisateur

voix
4

Comment ça ne sait qui UIViewController a son point de vue que la sous-vue de la fenêtre?

classe UIViewController maintient une carte statique entre les vues et leurs contrôleurs de vue. Cette carte est interrogé dans quelques endroits clés à l'intérieur CocoaTouch. En particulier, [UIView nextResponder] requêtes et renvoie le contrôleur se trouve.

Je suppose que UIWindow fait la même recherche avec sa vue racine de savoir quel contrôleur pour transmettre des événements de rotation à. Vérifiera la prochaine fois que je vais chercher quelque chose dans le démontage. (Je l'ai passé un peu CocoaTouch l'ingénierie inverse du temps pour comprendre comment les choses fonctionnent là-bas.)

Créé 06/05/2009 à 12:15
source utilisateur

voix
4

Tout cela est magique Vous ne jamais craindre. Il suffit d'ajouter la vue racine de votre contrôleur à la fenêtre - ou obtenir une barre d'onglets ou un contrôleur de navigation pour le faire pour vous - et il recevra ces messages.

(Mais si vous fouillez avec le débogueur, vous pouvez venir à la même conclusion que je:. Il y a une sorte de table interne cartographie point de vue de chaque contrôleur au contrôleur, et les messages sont envoyés basés sur ce lien)


Mise à jour: C'était magique vraiment privé en 2009 quand j'ai écrit cette réponse, mais les modifications suivantes à iOS ont fait les API derrière public. Le contrôleur de vue racine est maintenant accessible par la UIWindow.rootViewControllerpropriété, et l'arbre de contrôleurs de vue descendant est formé en utilisant la UIViewController.childViewControllerspropriété.

Les contrôleurs parents de vue sont responsables d'informer leurs enfants des changements d'orientation. (Je ne sais pas comment le contrôleur de vue racine est informé, mais vous pouvez définir un point d' arrêt et de trouver vous - même.) La -shouldAutomaticallyForwardRotationMethodsméthode décide si UIViewController le fera pour vous. Si elle retourne NO, vous devenez responsable de le faire dans votre -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:et les -didRotateFromInterfaceOrientation:méthodes.

Créé 14/02/2009 à 01:42
source utilisateur

voix
1

J'ai le même problème.

J'ai un jeu de travail en orientation paysage (paysage à la fois à gauche et à droite).

Afin de gérer une application multi-vue j'utiliser un UIViewController racine, soit une UIViewController factice avec un UIView qui ne fait rien. Je puis ajouter tous les autres UIView à lui comme une sous-vue.

Lors du démarrage de l'application, l'émulateur tourne rapidement à une orientation portrait, et je reçois tous mes vues avec elle la propriété de cadre ressemblant à (0, -80.320.480). Il en résulte la vue écrêtées par un rectangle de 160 x 320 sur le côté droit.

J'ai remarqué que la - shouldAutorotateToInterfaceOrientation: méthode de chaque sous-vue est appelée une seule fois, et que cela arrive quand il est ajouté à la vue racine. Plus tard, lors de la rotation du dispositif, seule la vue racine obtient c'est la méthode appelée.

Sans surprise, l'une des - appels willAnimate méthodes * ne sont envoyés à la vue racine, donc, de définir l'une de ces méthodes dans subviews est inutile.

Ces méthodes sont appelées à chaque fois que l'orientation est remplacée par une orientation acceptée par le - shouldAutorotateToInterfaceOrientation: méthode. donc je me suis dit que je pourrais chnage mes sous-vues de la propriété cadre à partir de là.

Pour ce faire, je définissais la méthode suivante dans ma classe de 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);
        ...
}

Je ne comprends pas pourquoi la propriété cadre est pas mis à jour, mais je sais que cette solution de contournement fonctionne.

J'espère que cela t'aides....

Créé 25/03/2010 à 05:20
source utilisateur

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