Le dimensionnement de la classe pour iPad les Modes portrait et Paysage
En gros, je veux avoir mes sous-vues positionné différemment selon l'orientation de l'iPad (Portrait ou Paysage) à l'aide de Dimensionnement des Classes introduites dans xcode 6. J'ai trouvé de nombreux tutoriels expliquant comment les différentes dimensionnement des classes sont disponibles pour les Iphones en mode portrait et paysage sur l'IB, mais cependant, il semble y avoir aucune couverture individuelle paysage ou en mode portrait pour l'iPad sur IB. Quelqu'un peut-il aider?
- Il semble ne pas être une non-solution de programmation, ce qui serait nécessaire pour l'écran par Défaut
Vous devez vous connecter pour publier un commentaire.
Il semble être d'Apple en intention de traiter, les deux iPad orientations de la même -- mais comme un certain nombre d'entre nous sont à trouver, il y a très légitime de la conception de raisons de vouloir changer la disposition de l'INTERFACE utilisateur pour iPad Portrait vs iPad Paysage.
Malheureusement, le système d'exploitation actuel ne semble pas fournir un soutien pour cette distinction ... ce qui signifie que nous sommes de retour à la manipulation de l'auto-contraintes de mise en forme dans le code ou similaire solutions de contournement pour accomplir ce que l'on devrait idéalement être en mesure d'obtenir gratuitement l'aide de l'INTERFACE utilisateur Adaptative.
Pas une solution élégante.
N'est-il pas un moyen d'utiliser la magie qu'Apple est déjà intégré dans l'IB et UIKit pour utiliser une taille de classe de notre choix pour une orientation?
~
Dans la réflexion sur le problème de manière plus générale, j'ai réalisé que la taille des classes " sont simplement des moyens pour répondre à de multiples mises en page qui sont stockés dans de l'IB, de sorte qu'ils peuvent être appelés en tant que de besoin lors de l'exécution.
En fait, un " taille de la classe est vraiment juste une paire de valeurs enum. De UIInterface.h:
Donc indépendamment de ce que Apple a décidé de nom ces différentes variations, fondamentalement, ils sont juste une paire d'entiers utilisé comme identifiant unique de toutes sortes, de distinguer une mise en page à partir d'un autre, stockés dans de l'IB.
Maintenant, en supposant que nous en créer une autre page (à l'aide d'un inutilisés classe de taille) de l'IB -- dire, pour l'iPad Portrait ... est-il un moyen d'avoir l'utilisation de l'appareil notre choix de classe de taille (disposition de l'INTERFACE utilisateur), si nécessaire, au moment de l'exécution?
Après avoir essayé plusieurs (moins élégant) approches du problème, je soupçonne qu'il y peut-être un moyen de remplacer la taille par défaut de la classe de la programmation. Et il y a (dans UIViewController.h):
Donc, si vous pouvez créer un package de votre point de vue contrôleur de hiérarchie comme un 'enfant' - vue-contrôleur, et l'ajouter à un parent de niveau supérieur-vue-contrôleur ... alors vous pouvez conditionnellement remplacer l'enfant en pensant que c'est une autre classe de grandeur que la valeur par défaut de l'OS.
Voici un exemple de mise en oeuvre que cette, dans le "parent" - vue-contrôleur:
Comme une démonstration rapide pour voir si cela a fonctionné, j'ai ajouté des étiquettes personnalisées spécifiquement à la "Régulière/Regular" et "Compact/Standard' versions de l'enfant contrôleur de mise en page de l'IB:
Et voici à quoi il ressemble en cours d'exécution, lorsque l'iPad est dans les deux orientations:
Le tour est joué! Personnaliser la taille de la classe configurations lors de l'exécution.
Espérons qu'Apple va faire de cette inutile dans la prochaine version de l'OS. Dans l'intervalle, cela peut être un plus élégant et évolutive approche par programmation de jouer avec auto-contraintes de mise en forme ou faire d'autres manipulations dans le code.
~
MODIFIER (6/4/15): s'il vous Plaît garder à l'esprit que l'exemple de code ci-dessus est essentiellement une preuve de concept pour montrer la technique. Libre à vous d'adapter en tant que de besoin pour votre application spécifique.
~
MODIFIER (7/24/15): Il est gratifiant de constater que l'explication ci-dessus semble pour aider à démystifier la question. Alors que je n'ai pas testé, le code par mohamede1945 [ci-dessous] ressemble à une utile d'optimisation pour des raisons pratiques. N'hésitez pas à tester et laissez-nous savoir ce que vous en pensez. (Dans l'intérêt de l'exhaustivité, je vais laisser l'exemple de code ci-dessus comme-est.)
UITraitCollection
est assez optimisé etoverrideTraitCollectionForChildViewController
est appelé rarement assez qu'il ne devrait pas être un problème pour faire la largeur de la case et puis créer.-viewWillTransitionToSize:withTransitionCoordinator:
Comme un résumé de la très longue réponse par RonDiamond. Tout ce que vous devez faire est à la racine de votre vue-contrôleur.
Objective-c
Swift:
Puis dans storyborad utiliser compact largeur pour le Portrait et la largeur standard pour le Paysage.
- (UITraitCollection *)traitCollection
au lieu deoverrideTraitCollectionForChildViewController
. Aussi les contraintes doivent correspondre à la traitcollections, de sorte wC(hAny).L'iPad a le cas "normal" taille de trait pour les deux dimensions horizontales et verticales, ce qui donne pas de distinction entre les modes portrait et paysage.
Ces traits de taille peut être remplacé dans votre personnalisé
UIViewController
sous-classe code, par l'intermédiaire de méthodestraitCollection
, par exemple:Cela donne à l'iPad de la même taille traits de caractère que l'iPhone 7 Plus. Notez que d'autres modèles d'iPhone ont généralement le " compact largeur de trait (plutôt que de largeur normale), indépendamment de l'orientation.
Imitant l'iPhone 7 Plus de cette manière permet à ce modèle d'être utilisé comme un stand-in pour iPad dans Xcode, Interface Builder, ce qui est pas au courant de personnalisations dans le code.
Être conscient que les avis divergent sur l'iPad peut utiliser différents traits de taille normale complète de l'écran de fonctionnement.
Cette réponse est fondée sur l'approche adoptée dans ce blog, avec quelques améliorations.
Mise à jour 2019-01-02: mis à Jour pour corriger intermittent caché barre d'état dans l'iPad paysage, et le potentiel du piétinement des (nouveaux) les traits d'
UITraitCollection
. Également de noter que la documentation d'Apple fait déconseille primordialtraitCollection
, de sorte que dans l'avenir il pourrait y avoir des problèmes avec cette technique.traitCollection
propriété en lecture seule: developer.apple.com/documentation/uikit/uitraitenvironment/...Long et de répondre de façon utile par RonDiamond est un bon début pour comprendre les principes, cependant le code qui a fonctionné pour moi (iOS 8+) est basé sur la méthode de remplacement
(UITraitCollection *)traitCollection
Donc, d'ajouter des contraintes dans InterfaceBuilder avec des variations de Largeur - Compact, par exemple pour la contrainte est bien Installé. Donc, Largeur - Tout sera valable pour le paysage, Largeur - Compact pour le Portrait.
Pour passer des contraintes dans le code en fonction de la vue courante contrôleur de taille, il suffit d'ajouter la ligne suivante dans votre classe UIViewController:
Combien différente est votre mode paysage va être que votre mode portrait? Si ses très différents, il pourrait être une bonne idée de créer un autre point de vue et contrôleur de charge lorsque l'appareil est en mode paysage
Par exemple
Swift 3.0 code pour @RonDiamond solution