Je viens de regarder la vidéo # 216 de la WWDC, "Créer une interface utilisateur adaptative avec UIKit".
Vers 45h10, Tony Ricciardi parle des modifications apportées à IB dans Xcode 6 pour prendre en charge les nouvelles modifications.
Il dit "Vous pouvez déployer ces documents à l'envers vers les anciennes versions d'iOS".
(où "Ces documents" signifie vraisemblablement les XIB et les storyboards qui ont des paramètres spécifiques pour différentes classes de taille.)
Je n'invente pas ça. Allez regarder la vidéo de la WWDC.
Comment est-ce possible? Les collections de traits et les classes de taille ne sont définies que dans iOS 8. Comment le comportement d'exécution qui dépend des constructions d'interface utilisateur nouvelles dans iOS 8 peut-il fonctionner dans les versions iOS précédentes?
S'il est possible , il serait merveilleux. Vous pouvez créer des applications qui fonctionneront sur iOS 6, 7 et 8, et tirer parti des nouvelles capacités de disposition d'interface utilisateur flexible qu'Apple a ajoutées à Xcode 6. J'ai créé moi-même une logique d'interface utilisateur adaptative dans le code, et c'est un peu de travail.
la source
Réponses:
Les modifications apportées à l'interface utilisateur avec les classes de taille dans Interface Builder apparaissent correctement sur les appareils iOS 7 et l'aperçu dans Xcode. Par exemple, j'ai modifié certaines contraintes de mise en page automatique et tailles de police pour Hauteur régulière Largeur régulière et ces contraintes modifiées sont visibles dans le simulateur iPad exécutant iOS 7.0.
Toutes les optimisations de classe de taille sont disponibles pour iOS 7, à l'exception des classes de taille qui ont une hauteur compacte. Cela a été confirmé par Apple et est maintenant indiqué directement dans la documentation :
Pour les applications prenant en charge les versions d'iOS antérieures à iOS 8, la plupart des classes de taille sont rétrocompatibles.
Les classes de taille sont rétrocompatibles lorsque:
- L'application est créée à l'aide de Xcode version 6 ou ultérieure
- La cible de déploiement de l'application est antérieure à iOS 8
- Les classes de taille sont spécifiées dans un storyboard ou xib
- La valeur du composant de hauteur n'est pas compacte
Parce qu'iOS 7 ne respecte pas quelques classes de taille, si vous les utilisez, vous rencontrerez des problèmes. Par exemple: lorsque vous avez défini Compact w Any h puis Compact w Compact h défini, sur iOS 7, il respectera le Compact w Any h mais sur iOS 8, il rendra l'apparence Compact w Compact h.
Donc, si vous souhaitez utiliser ces deux classes de taille et maintenir la compatibilité avec iOS 7, je ferais toutes les optimisations que vous souhaitez pour l'iPhone en mode paysage dans Any w Any h ou Compact w Any h, puis effectuez vos autres optimisations pour différentes classes de taille si nécessaire, et de cette façon, vous n'aurez pas besoin d'utiliser une classe de taille avec une hauteur compacte et vous éviterez de rencontrer des problèmes.
la source
Compact-Compact
n'est pas exporté pour iOS 7;Compact-Regular
est. Voir ma réponse pour plus de détails.Lors du déploiement de votre application sur iOS 7, Xcode compilera votre storyboard de deux manières différentes:
Pour iPhone, votre storyboard est compilé en tant que "Compact-Regular" (largeur compacte, hauteur régulière), et il est emballé comme votre pointe "~ iphone".
Pour iPad, votre storyboard est compilé en tant que "Regular-Regular" et est emballé comme votre pointe "~ ipad".
Donc, si vous souhaitez déployer à la fois sur iOS 7 et iOS 8, vous devez concentrer votre conception sur les classes de taille Compact-Any et Regular-Any. Cela vous donnera la meilleure expérience en termes de correspondance de l'interface utilisateur entre les cibles de déploiement. Vous êtes, bien sûr, invité à modifier la mise en page pour d'autres classes de taille, mais à moins que ces modifications ne soient appliquées aux classes de taille Compact-Regular ou Regular-Regular, vous ne verriez pas ces modifications sur iOS 7.
la source
Remarque: cette réponse était pertinente pour une version bêta de Xcode 6 et n'est plus applicable à la version d'expédition. Voir les réponses de Joey et Dave DeLong sur cette page pour des informations appropriées.
(réponse originale conservée ci-dessous):
Bien qu'il soit
Storyboards/XIBs
configuré pour utiliser les classes de tailleiOS 7
, le système d'exploitation ne respecte actuellement pas cessize classes
et semble utiliser la classe de taille par défaut «Any / Any».Je conviens que la diapositive à laquelle vous faites référence semble promettre une telle compatibilité, mais cela ne semble pas être le cas actuellement
(Xcode 6 beta 2)
.Pour tester, j'ai créé un projet
(iOS 8 SDK, deployment target of 7.1)
avec un seul bouton qui est centrévertically and horizontally
dans la classe de taille Any / Any, mais aligné sur le coin supérieur gauche dans la classe de taille Compact / Compact (par exemple iPhone en paysage). L'assistant d'aperçu de Xcode montre que le bouton change de position dansiOS 8
, mais pasiOS 7
. J'ai également confirmé ce comportement sur uniOS 7
appareil.la source
Comme certaines des réponses et des commentaires discutaient de la nature de la rétrocompatibilité, j'ai pensé partager un extrait directement de la documentation Apple :
~~~~~
Déployer une application avec des classes de taille sur des versions iOS antérieures
Pour les applications prenant en charge les versions d'iOS antérieures à iOS 8, la plupart des classes de taille sont rétrocompatibles.
Les classes de taille sont rétrocompatibles lorsque:
~~~~~
Ce dernier point est ciblé sur cette discussion, où Apple confirme que tant que la "hauteur compacte" n'est pas utilisée , elle doit maintenir la compatibilité descendante.
J'espère que cela aide quelqu'un!
la source
En traitant le problème similaire, j'ai trouvé une autre réponse que je n'ai pas encore vue ici. Il semble que les classes de taille dans les
XIB
fichiers ne fonctionnent pas du tout. Si je crée un prototype de cellule dans lestoryboard
fichier, cela fonctionne dans iOS7 comme expliqué dans d'autres réponses, mais lorsque la même cellule prototype est déplacée dans une cellule séparéeXIB
fichiers les classes de taille de fichier sont ignorées dans iOS7.Voici le lien vers l'exemple de projet démontrant ce comportement: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip
Dans la cellule prototype, j'ai quatre contraintes de chaque bord de la vue grise. Chacun des est configuré de la même manière: Any / Any - 10, Regular / Regular - 20
Cela fonctionne bien dans le simulateur iOS8 pour XIB et Storyboard, et dans iOS7, seules les cellules définies dans Storyboard reçoivent des contraintes mises à jour sur iPad:
la source
Si cela fait gagner du temps à quelqu'un, je pense que la façon dont Xcode 6 fournit une compatibilité quasi-rétrospective pour les classes de taille se fait via les storyboards historiques
~ipad
et~iphone
suffixés, et rien de plus. Cela a du sens puisque les classes de taille sont une manière plus abstraite de la façon dont nous avons précédemment défini un storyboard iPad et un storyboard iPhone.Par conséquent:
Si votre objectif est d'utiliser des classes de taille pour prendre en charge les dispositions spécifiques aux familles d'appareils (iPad vs iPhone), vous avez de la chance: les classes de taille sont une interface plus agréable avec la méthode précédemment prise en charge.
Si votre objectif est d'utiliser des classes de taille pour prendre en charge des mises en page modifiées pour différents modèles au sein de la même famille de périphériques, c'est-à-dire. iPhone 5/6/6 + inc. paysage, alors vous n'avez pas de chance . Leur utilisation nécessiterait une cible de déploiement iOS 8 minimum.
la source
@lducool - Dans le générateur d'interface, dans l'inspecteur d'identité, remplacez 'Builds For' par iOS7.1 et versions ultérieures.
la source
Malheureusement, les réponses de Dave et Joey ne fonctionnent pas pour moi. Je ne suis pas autorisé à commenter dans ce fil, alors veuillez me pardonner si ce n'est pas le bon endroit.
J'ai posé une question spécifique pour cela: Exemple pour l'interface utilisateur adaptative portrait paysage iPhone qui est rétrocompatible avec iOS 7
D'après ce que j'ai appris jusqu'à présent, je crois maintenant que, comme dans mon exemple, il n'est pas possible d'avoir 2 contraintes distinctes et distinctes pour un élément d'interface utilisateur en mode portrait et paysage avec l'iPhone iOS7 en fonction des classes de taille. Je serais heureux si je me trompe, cependant.
la source