7
votes

Autoriser des vues de contrôleur de navigation différentes d'avoir des règles d'orientation différentes

J'essaie de suivre une question précédente en permettant à un contrôleur de navigation de contrôler les contrôleurs d'avoir des règles d'orientation différentes. Question précédente

Donc, par exemple, j'ai deux contrôleurs d'affichage le premier est un accueil la deuxième maison. Je voudrais que le premier contrôleur d'affichage ne soit que Patrait et la seconde (à la maison) pour permettre à la fois port / paysage. P>

Je ne suis pas sûr de bien comprendre tout ce que vous comprenez. Une fois que je le fais, j'ai l'intention de créer un projet séparé expliquant comment procéder et d'ajouter à GitHub / Partager sur la question pour une référence future. P>

Dans ce projet particulier, j'utilise un contrôleur de visualisation de côté Github. PpprevealsiViewController. P>

Mon délégué de mon application est le suivant: P>

-(void)viewWillAppear {
    BOOL setLandscapeOK = YES;
}


2 commentaires

Qu'est-ce que vous essayez d'accomplir? Quelle est la question?


C'est dans la question "Alors, par exemple, j'ai deux contrôleurs d'affichage le premier est un accueil de la deuxième maison. J'aimerais que le contrôleur de premier point de vue ne soit que Potrait et le second (à la maison) pour permettre à la fois port / paysage."


3 Réponses :


0
votes

est votre méthode de viewwillappear appelée? La méthode réelle est - (vide) Viewwillappear: (bool) animée .

Mis à part cela, le problème est que le support d'interventions est appelé avant la viewwillappear. Essayez de définir votre drapeau BOOL dans votre méthode InitwithNibName.

EDIT:

quelque chose comme ceci: xxx

EDIT 2:

Je viens de me remarquer ' Re-déclare Setlandscapeok comme nouvelle variable dans la viewwillappear. Cela cache l'instance de cette superclasse de cette variable. Essayez d'utiliser Self.setlandScapeok au lieu de Bool Setlandscapeok

Editer 3:

Puisque vous ne sous-classez pas votre contrôleur de navigateur principal, les choses ci-dessus ne fonctionnent pas. Vous aurez besoin d'un moyen explicite de notifier votre contrôleur de navigation selon lequel la sous-navigation ne veut pas qu'il appuie certaines orientations. Lorsque vous appuyez sur la liste de visualisation, Setlandscapeok doit être défini sur NO.


8 commentaires

J'ai mis à jour la méthode en vain. Ajout également un NSLog pour vous assurer qu'il est appelé ... et c'est. J'ai déplacé le Setlandscapeok = non; (Pour le premier contrôleur d'affichage bienvenu) dans la vue ViewDidLoad à la place et toujours aucune différence. Je ne peux pas emménager dans * withnibname comme je n'utilise pas de nibiles


J'ai mis à jour mon message à quelque chose que vous pouvez essayer d'ajouter. Que vous utilisiez des pointes ou non, cette méthode est encore appelée.


1. Si je définis la modification ci-dessus, j'ai une propriété d'erreur Setlanscapeoknot trouvé ... dans MeswelcomeviewController. En effet, j'ai sous-classé le contrôleur NAV pour ajouter cette variable non vue contrôleur? 2. Je reçois aussi une erreur de mise à jour de Self.setwlandScapeok dans la Sous-classe NAV Controller - Property Setlandscapeok introuvable sur MesnavviewControllersUClass Vous voulez avoir accès à la variable d'instance?


Ok je vois ce que tu fais maintenant. Votre contrôleur NAV est votre ViewController root et vous avez deux contrôleurs de vue distincts que vous appuyez sur le contrôleur NAV. IOS gère la rotation basée sur le contrôleur de visualisation de racine de niveau le plus élevé qui prend tout l'écran, dans ce cas, c'est votre contrôleur NAV. Je vais éditer mon post à nouveau


Je ne sais pas que je comprends le problème d'édition ou de réalité ici suffisamment. J'ai essayé de sous-classe le pprevealsipanel qui est aussi le niveau supérieur et ajouté les informations précédemment dans la sous-classe des contrôleurs NAV à partir des informations de question ci-dessus, mais toujours le même problème ne fonctionne pas


Les règles de rotation s'appliquent uniquement à la vue de niveau le plus élevé qui prend tout l'écran. Donc, si vous avez un contrôleur de navigation qui pousse les autres contrôleurs d'affichage sur elle-même, les règles de rotation du contrôleur de navigation seront les seules que les vérifications de l'application. Cela signifie que votre drapeau Bool doit être dans la classe de contrôleur de navigation et vous devez le changer en fonction de la vue que vous avez poussée.


D'accord. Donc, dans ce cas, j'ai une industrie pprevealsiViewntroller en tant que niveau supérieur, puis un contrôleur NAV en ce sens, puis la vue pertinente actuellement poussée. J'ai besoin de la vue actuelle pour décider de l'écran entier (toutes les trois vues, View / Nav / ReventionSide) doit faire pivoter. Je ne suis pas sûr comment implémenter cela?


J'ai également essayé de mettre à jour le MessidePanelViewControllersUClass avec le code de contrôleur NAV inclus dans la question. A ensuite mis à jour le contrôleur d'affichage de bienvenue initwithnibname pour avoir '[(MessidepanelViewControllerclasslass *) [auto-navigationcontroller] Setlandscapeok: Oui];' Mais je reçois une erreur - aucune interface visible pour MessidePanelViewControllersUglass déclare le sélecteur Setlandscapeok? Comment faire ce sélecteur?



0
votes

Qu'est-ce qui ne va pas dans votre cas, c'est que vous remplissez-le -supportedinterfaceorInsorIntions dans cette sous-classe d'UinavigationController, de sorte que la méthode ne soit jamais transmise à ses observateurs de votre enfant. Vous déclarez également un nouveau Setlandscapeok Bool dans la viewwillappear, sans changer le global. Ce qui est bizarre est que celui basé sur le code que vous avez posté votre application doit être bloqué dans Portrait, ne permettez pas à toutes les orientations, car vous ne semblez jamais régler le Boolean Setlandscapeok sur Oui dans la sous-classe UinavigationController.

Mais vous semblez faire beaucoup plus compliqué que ce qu'ils ne devraient l'être. Vous ne devriez pas avoir besoin de cet établissement Boolean et vous ne devriez pas avoir besoin de sous-classe UinavigationController ou de la PPPrevealsiveViewController Juste pour le problème de rotation. PpprevealsiveViewController et UinavigationController sont des conclusions de conteneur, AKA ViewControls de ViewContrôleurs contenant des enfants ViewControls. Par défaut lorsqu'un rappel d'orientation est appelé sur la visiteuse parent, il appellera et renvoie la même méthode de la visionneuse enfant.

Lorsque -shouldaTorTutorotate, -SupporteDinterFaceOrientations ou -ShouldaTorTotaTotaToTerOtTerritère est appelé à la PPPrevealsiViewController, il appellera les mêmes méthodes sur sa racine racineviewcontroller, dans votre cas une uoinavigationController. L'UINAVIGATIONCONTROLLER est également un mode de vue du conteneur et appellera la même méthode sur la vue ViewController actuellement visible, dans votre cas, soit la liste de bienvenueViewController ou la homologueController.

Donc, tout ce que vous avez à faire est de remplacer -supportedinterfaceOriendiennes et -ShouldaTorTotaToTerOteTointOrientation dans la liste d'accueilViewController (retour Portrait uniquement) et la messagerie homologue (retour tout). Ne remplacez pas ces méthodes dans MesnavviewController, vous n'avez même pas besoin de cette sous-classe. Vous n'avez pas besoin de faire autre chose. Vous pouvez supprimer ce Setlandscapeok Boolean dans toutes vos cartes de visitement.


4 commentaires

Merci pour votre réponse. J'ai mis à jour le code et supprimé la sous-classe pour NAV / RILLSSide commentant tout ce qui précède. J'ai ajouté assisterfaceOrientations à la fois à la fois à la maison et à la bienvenue, mais le duttoratorateToinTerFaceOrientation est amorti ... Il suffit de disposer des conférences de soutien aux deux contrôleurs d'affichage ne fonctionne pas. Ils autorisent toujours le port / le paysage maintenant, toutes les autres pensées?


DoTutorAtorAtOsterSerTointerFaceOrientation est obsolète dans iOS6, mais vous devez toujours la mettre en œuvre si vous prenez également en charge IOS5. Si vous testez sur IOS5, essayez de mettre en œuvre cela en premier. Essayez de définir les points d'arrêt dans les méthodes prises en chargeInterfaceOrientsOrientIntions et DoDAutoTutoreTerToinToinSerFaceOrientation et regardez la pile d'appels pour voir quand et par quel type de mode parent ces méthodes sont appelées.


Vous êtes correct mais pour le moment je suis en construction pour iPhone 6.0. J'ai mis en œuvre les deux méthodes dans mes contrôleurs de bienvenue / home, mais également à l'orientation. J'ai regardé ici: - développeur.apple.com/library/ios/#finarédArticles/.../a> et cela semble être configuré correctement, mais il doit être primordial quelque part. Lors de l'essai dans iOS6.0 Simulator, je vois que les confidentiels supportés sont appelés mais aucune différence faite.


Toute autre pensée @snpppls?



2
votes

7 commentaires

C'est ce que j'ai essayé de mettre en œuvre mais je ne comprends pas complètement comment cela devrait fonctionner.


Ok, j'ai fait un échantillon pour vous, je ne suis pas sûr que c'est ce que vous recherchez .... Dans l'échantillon, la vue11 sera autorotate et View2 n'atortiera pas sous le même contrôleur NAV. Trouver le code ici sendspace.com/file/b5jmjv


Je l'ai téléchargé, mais dans votre exemple, les deux contrôleurs peuvent faire du paysage et du portrait. Je cherche un portrait seulement et les deux?


D'accord, vous devez gérer le support d'internoménomatisation, préférez-lainterfaceorientationforpresentation. J'ai modifié le code, car je n'ai pas de sdk iOS6 à la maison, je ne pouvais pas le tester..mais, je pense que cela devrait fonctionner. Il peut y avoir de petites erreurs, mais vous devriez être capable de modifier. Dans le nouveau code, la vue1 se chargera de portrait depuis que je définis une orientation préférée sous la forme de portrait et de View2 sera chargée dans n'importe quelle orientation, le code de députation reste identique. SENDSPACE.COM/FILE/F2Z81Z


Vous êtes correct, je reçois une erreur - aucun visible @interface pour Nsarray ne déclare le sélecteur TopViewController. Comme je ne sais pas assez de ce que vous essayez d'expliquer, je suis perdu d'être honnête ...


Nous avons bientôt parlé, j'ai mis à jour ces lignes sur [Self.AnavigationController TopViewController ... qui résolvait le problème. Je devrais être capable de le faire sortir d'ici, merci


Je ne peux pas attribuer la prime mais comme vous êtes la seule réponse acceptée, elle vous attribuera automatiquement.