Comment les interfaces utilisateur adaptatives Xcode 6 peuvent-elles être rétrocompatibles avec iOS 7 et iOS 6?

137

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.

Duncan C
la source
2
Il existe également un document d'Apple qui décrit la compatibilité avec les versions <8
Alladinian

Réponses:

151

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.

Jordanie H
la source
Je peux confirmer qu'en Beta4, la classe de taille Compact / Compact n'est pas respectée dans le simulateur ou sur un appareil iOS 7. Intéressant que certaines classes de taille soient respectées. Merci pour le test.
remmah le
Test pour Regular / Regular sur un appareil et il ne répond PAS aux personnalisations de classe de taille, tout ce que j'obtiens est Any / Any avec Beta 7
hokiewalrus
@hokiewalrus Je viens de vérifier avec Xcode 6 beta 7 et j'obtiens exactement les mêmes résultats que j'ai détaillés dans la réponse. La modification de la largeur de la boîte dans IB pour Regular Regular s'affiche correctement sur iPad exécutant iOS 7.1.
Jordan H
3
@Joey ce n'est pas un bug; c'est intentionnel. Compact-Compactn'est pas exporté pour iOS 7; Compact-Regularest. Voir ma réponse pour plus de détails.
Dave DeLong le
2
Devrait être la réponse acceptée, la réponse ci-dessus est trompeuse.
Dominic Lacaille
68

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.

Dave DeLong
la source
Ma compréhension de votre réponse est que "Regular-Regular" devrait fonctionner dans iPad iOS7. Mais ça ne fonctionne pas. J'ai testé dans la version XCode6 GM. Veuillez me corriger si j'avais mal interprété votre réponse.
Iducool
4
Il semble que le travail régulier ne fonctionne que sur le storyboard, pas sur xib
Boris Charpentier
@BorisCharpentier J'ai signalé un bug à propos de ce rdar: // 18737656 , qui a été fermé en tant que duplicata du # 18490866 ouvert
Maxim Pavlov
@BorisCharpentier avez-vous trouvé une solution pour xib?
saadnib
4
@BorisCharpentier, je viens de découvrir que ce problème a été résolu dans XCode 6.1.1 :-)
saadnib
27

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/XIBsconfiguré pour utiliser les classes de taille iOS 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 horizontallydans 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 dans iOS 8, mais pas iOS 7. J'ai également confirmé ce comportement sur un iOS 7appareil.

remmah
la source
Roy, merci d'avoir répondu. Je n'ai pas encore eu le temps de tester cela moi-même, et je l'apprécie. Le présentateur de cette vidéo aurait dû être plus clair. Je pense qu'il a dû signifier que les fichiers XIB / Storyboard peuvent être lus par iOS 6 et 7, mais sans prise en charge de l'interface utilisateur adaptative. Cela rend problématique le codage des applications fonctionnant sous iOS <8.
Duncan C
En effet. Je me demande s'il existe une documentation officielle sur la façon de prendre en charge les nouvelles classes de taille et l'ancienne approche orientation / idiome dans le même Storyboard / XIB. Je mettrai à jour la réponse si je trouve quelque chose.
remmah
D'après mon expérience, Apple semble penser que les anciennes versions d'OS cessent d'exister dès qu'elles annoncent une nouvelle version. En fait, l'équipe d'ingénierie semble cesser de prêter attention à une nouvelle version du système d'exploitation dès sa sortie, et commencer à concentrer toutes ses énergies sur la prochaine version majeure. Je n'ai JAMAIS eu de bogue que j'ai soumis corrigé dans la version majeure actuelle. They
Duncan C
3
Cela ne semble plus être le cas avec Xcode 6 beta 4. Voir la réponse que je viens d'ajouter.
Jordan H
1
@Joey merci pour la tête haute; J'ai édité ma réponse pour renvoyer les lecteurs à votre réponse, ainsi qu'à celle de Dave.
remmah
12

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:

  • 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

~~~~~

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!

radiovisuel
la source
C'est génial, c'est maintenant documenté, merci pour la publication!
Jordan H
3

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 XIBfichiers ne fonctionnent pas du tout. Si je crée un prototype de cellule dans le storyboardfichier, 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

entrez la description de l'image ici

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:

entrez la description de l'image ici

sha
la source
$ ^% $ ^% @ # ^ & @ #% & ^% ... et me voici avec beaucoup de fichiers xib et le déploiement sur iOS 7 et 8.
TheEye
Exactement. Je combinais des storyboards iPhone et iPad en un seul et je pensais que séparer les cellules dans leur propre fichier XIB aiderait :). J'apprécierais si vous pouviez attribuer +1 à ma réponse.
sha
1
Je vois ce même comportement.
bjtitus
2

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 ~ipadet ~iphonesuffixé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.

Jonathan Crooke
la source
1

@lducool - Dans le générateur d'interface, dans l'inspecteur d'identité, remplacez 'Builds For' par iOS7.1 et versions ultérieures.

Cendre R
la source
Aucune différence de rendement.
Iducool
1

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.

Tom Major
la source