Comment remplacer le trait de la collection initiale UIViewController? (avec Storyboard)
J'ai une application ciblée iOS8 et initiale-vue-contrôleur est UISplitViewController. J'utilise storyboard, de sorte qu'il gentiment instancier tout pour moi.
À cause de mon design que j'ai besoin SplitViewController à montrer à la fois maître et des vues de détail en mode portrait, sur iPhone. Donc, je suis à la recherche d'un moyen de remplacer le trait de collection pour cette UISplitViewController.
J'ai trouvé que je peux utiliser
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!) { ... }
mais, malheureusement, il ya seulement des méthodes pour remplacer enfant contrôleurs de traits collections:
setOverrideTraitCollection(collection: UITraitCollection!, forChildViewController childViewController: UIViewController!)
et je ne peux pas le faire pour soi dans ma UISplitViewController sous-classe.
J'ai vérifié un exemple d'application Adaptative Photos d'Apple. Et dans cette application, l'auteur utilise spécial TraitOverrideViewController en tant que root et un peu de magie dans son viewController setter pour faire tout cela fonctionne.
Il semble horrible pour moi. Est qu'il y a moyen de contourner pour remplacer les traits? Ou Si il n'y a pas, comment puis-je gérer à utiliser le même hack avec storyboard? En d'autres termes, la façon d'injecter quelques viewController comme racine uniquement pour gérer les traits de mon UISplitViewController avec storyboard?
AAPLTraitOverrideViewController.m
est à peine plus de 20 lignes de code. Il vous faudra peut-être 10 minutes pour les transformer en rapide et puis vous n'avez pas à regarder à nouveau.voir mise à jour. Et non, je ne crois pas que ce genre de code sera libre de les maintenir. Enfin, maintenant j'ai besoin d'expliquer mes collèges quel est-il et pourquoi nous avons besoin d'un. Je ne peux pas raisonner sur chaque ligne, ce qui me fait me sentir mal. Pourquoi nous avons besoin de didMoveToParentViewController? Ou pourquoi nous avons besoin de shouldAutomaticallyForwardRotationmethods si c'est déconseillé?
et exemple d'application n'a pas vérifié les caractéristiques de la charge, de sorte qu'il sera en mauvais état, si vous le lancez en mode portrait... mon code ci-dessus hériter de cette question. Mettra à jour.
OriginalL'auteur Ilya Belikin | 2014-08-25
Vous devez vous connecter pour publier un commentaire.
Ok, je souhaite qu'il y avait une autre façon de contourner cela, mais pour l'instant j'ai juste converti code de la Pomme exemple de Swift et ajusté à une utilisation avec des story-boards.
Il fonctionne, mais je crois encore que c'est un affreux moyen pour archiver cet objectif.
Mon TraitOverride.swift:
Pour le faire fonctionner, vous devez ajouter un nouveau UIViewController sur la table de montage séquentiel et en a fait la première. Ajouter montrent des enchaînements de votre commande réelle comme ceci:
Vous avez besoin de nom de la séquence "toSplitVC":
et définir les initiales contrôleur de TraitOverride:
Maintenant, il devrait fonctionner pour vous aussi. Laissez-moi savoir si vous trouvez une meilleure façon ou tous les défauts de celui-ci.
OriginalL'auteur Ilya Belikin
Je comprends que vous vouliez une rapide traduction ici... Et vous avez probablement résolu.
Ci-dessous est quelque chose que j'ai passé beaucoup de temps à essayer de le résoudre - l'obtention de mon écran à double affichage splitview de travailler sur un iPhone 6+ - c'est un Cacao solution.
Ma Demande est TabBar base et l'écran à double affichage splitview a manettes de Navigation. À la fin, mon problème était que setOverrideTraitCollection n'a pas été envoyés à la bonne cible.
Et lorsque vous masquez la barre d'onglet, manettes de navigation en bas de la ligne ont mal la barre d'outils, flotte au-dessus de la barre d'onglet.
OriginalL'auteur David Wilson
Je sais que c'est plus d'un an puisque la question a été posée, mais je pense que ma réponse vous aidera à quelqu'un comme moi qui n'ont pas atteint le succès avec la accepté de répondre.
Whell la solution est très simple, il vous suffit de remplacer
traitCollection:
méthode. Voici un exemple de partir de mon application:l'idée est de forcer la taille Compacte de classe sur iPad si le contrôleur est présenté comme une liste ou de la forme de la feuille.
Espère que cela aide.
Mise à JOUR:
Apple n'est pas recommandé:
Je ne suis pas en utilisant cette méthode! Maintenant, je suis la mise en œuvre de
overrideTraitCollectionForChildViewController:
parent viewControler classe.Pour info, voici le lien pour la remarque sur les pas de substitution de la
traitCollection
: developer.apple.com/reference/uikit/uitraitenvironment/...Veuillez modifier la réponse à supprimer les mauvaises choses
OriginalL'auteur Oleg_Korchickiy
Oui, elle doit utiliser le conteneur personnalisé-Vue-Contrôleur de surcharger la fonction viewWillTransitionToSize. Vous utilisez la table de montage séquentiel pour placer le récipient-Vue-Contrôleur initial.
Aussi, vous pouvez vous référer cette bonne artical qui utilisent le programme de mise en œuvre. Selon elle, le jugement portrait pourrait avoir certaines limitations:
autres que
"
OriginalL'auteur Jenus Dong
L'extra haut niveau VC fonctionne bien pour une application simple mais il ne peut pas se propager vers le bas pour modal présenté de VC comme ils n'ont pas un parentVC. Donc, vous devez l'insérer de nouveau dans des endroits différents.
Une meilleure approche que j'ai trouvé était juste à la sous-classe UINavigationController puis il suffit d'utiliser votre sous-classe dans la table de montage séquentiel et partout où vous utilisez normalement UINavigationController. Il enregistre le supplémentaires VC encombrement dans les storyboards et économise aussi de l'encombrement supplémentaire dans le code.
Cet exemple fera tous les iPhones utilisation régulière de la taille horizontale de classe pour le paysage.
Où avez-vous lu cela?
Parce que son appelé un million de fois, en plus de sa trop tard pour influer sur ce contrôleur.
Il ne fonctionne pas, j'utilise ce code dans mon propre application. Si il est documenté pour ne pas surcharger cette méthode, puis je suis curieux de voir où.
il peut-être fonctionne pour vos applications car la manette de navigation n'est pas affectée par des traits de type split-vue-contrôleur est.
OriginalL'auteur trapper
Accessoires @Ilyca
Swift 3
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
comme dans la Swift 2 code ci-dessus (avec quelques modifications).Une chose est sûre. Accessoires pour @Ilyca pour l'introduction de ce aussi bien pour moi.
OriginalL'auteur Brandon A