2010-09-09 5 views
1

J'ai une hiérarchie de vue assez simple dans mon application iPad.Envoyer un message à une sous-vue après autorotate

Fenêtre -> RootView -> TableView/DetailView

TableView et DetailView sont frères et sœurs ajoutés en tant que sous-vues (comme par une solution à une question précédente). Au lancement, TableView est devant. Lorsque vous sélectionnez une cellule, la méthode dans le délégué de l'application est appelée, ce qui permet de l'échanger en plaçant DetailView au premier plan. Un bouton de fermeture dans DetailView fait l'inverse.

Fonctionne très bien.

Mais ... DetailView contient un UIScrollView, dessiné dans le .xib Quand DetailView vient à l'avant, j'ai une méthode qui reçoit les détails du contenu de la cellule dont la sélection a déclenché le changement. Cela remplit la vue détaillée avec le contenu de l'étiquette et une image. Les étiquettes sont de simples paramètres pour IBOutlets pour les étiquettes dans le fichier .xib L'image est dimensionnée à la hauteur de l'UIScrollView, en maintenant le rapport d'aspect. Ceci est fait par programme, en l'ajoutant à un UIImageView qui est ajouté à UIScrollView.

Le comportement que j'ai est bon pour Portrait. Lorsqu'il passe en mode Paysage, je souhaite redimensionner l'image pour qu'elle corresponde à la largeur de l'UIImageView englobant (et par la suite à l'UIScrollView englobant). J'ai un grand code pour redimensionner réellement l'image (avec la permission d'un ajout de catégorie à UIImage de [texte du lien] [1]

PROBLÈME ... Seul le RootViewController répond aux appels à didRotateToInterfaceOrientation. je dois envoyer un message à une méthode sur le contrôleur DetailViews en lui disant de redimensionner l'image puis redessiner le UIImageView associé Référencer le contrôleur d'une sous-vue semble comme il devrait être simple et peut-être qu'il me manque une réponse facile J'ai essayé à utiliser:

[[self.view.subviews objectAtIndex:1] didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 

etMais ils retournent tous deux la vue PAS le contrôleur de vues, et se mettent donc en colère contre les sélecteurs lorsque je tente de l'exécuter.

Quelqu'un peut-il m'indiquer le bon chemin?

Répondre

0

Le Le meilleur moyen d'obtenir des méthodes de rotation invoquées sur tous vos contrôleurs de vue est d'utiliser un contrôleur de vue racine fourni par Apple et d'afficher les vues enfants via ces contrôleurs. Ceux-ci incluent UINavigationController, UITabBarController et sur l'iPad UISplitViewController.

Les événements de navigation seront uniquement envoyés au contrôleur de vue racine, c'est-à-dire le contrôleur de vue de la vue dans l'UIWindow principale de votre application. Ceci n'est pas documenté, mais peut être déduit avec un peu de travail. Les contrôleurs de vue racine d'Apple semblent être capables de propager des événements de rotation.Ceci peut être réalisé manuellement (c'est-à-dire sans un Apple RVC) mais nécessite le suivi de tous les VC de votre enfant et l'utilisation de KVC sur certaines propriétés en lecture seule, qui vous feraient expulser du magasin d'applications.

Dans votre cas pouvez utiliser un contrôleur de navigation, en masquant la barre de navigation et la barre d'outils selon le cas. Initialisez-le avec votre contrôleur de vue racine actuel et ajoutez la vue de contrôleur de navigation à la fenêtre, au lieu de votre contrôleur de vue racine actuel. Lorsque vous avez besoin d'afficher les détails, appuyez simplement sur les détails de la pile de navigation. Si vous n'aimez pas l'animation par défaut, vous pouvez appliquer votre propre transition avec un peu de travail.

Voir ci-dessous pour plus de détails sur le contrôleur de navigation.

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html

1

Soupir. semble que le processus d'écriture sur la question m'a aidé à formuler mieux dans mon esprit et trouver la réponse ...

Référence le délégué application qui a déjà des connexions aux contrôleurs de vue ...

[[(AppDelegate *)[[UIApplication sharedApplication] delegate] detailViewController] methodToCall]; 
Questions connexes