web-dev-qa-db-fra.com

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

Je viens de regarder la vidéo n ° 216 de la WWDC, "Création d'une interface utilisateur adaptative avec UIKit".

À environ 45 h 10, 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 en arrière sur les anciennes versions d’iOS".

(où "Ces documents" signifie probablement que les XIB et les storyboards ont des paramètres spécifiques pour différentes classes de taille.)

Je n'invente rien. Allez regarder la vidéo de la WWDC.

Comment est-ce possible? Les collections de caractères et les classes de taille ne sont définies que dans iOS 8. Comment un comportement d'exécution qui dépend des constructions d'interface utilisateur nouvelles pour iOS 8 peut-il fonctionner dans les versions précédentes d'iOS?

Si est possible, ce serait merveilleux. Vous pouvez créer des applications qui s'exécuteront sur iOS 6, 7 et 8 et tirer parti des nouvelles capacités de présentation de l'interface utilisateur flexibles que Apple a ajoutées à Xcode 6. J'ai créé une logique d'interface utilisateur adaptative. moi-même dans le code, et c'est un peu de travail.

137
Duncan C

Les modifications apportées à l'interface utilisateur avec les classes de taille dans Interface Builder apparaissent correctement sur les périphériques iOS 7 et l'aperçu dans Xcode. Par exemple, j'ai modifié certaines contraintes de disposition automatique et certaines tailles de police pour une hauteur normale. Une largeur normale et ces contraintes modifiées sont visibles dans le simulateur iPad sous iOS 7.0.

Toutes les optimisations de classe de taille sont rendues disponibles pour iOS 7, à l'exception des classes de taille qui ont une hauteur réduite. Ceci 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 compatibles avec les versions antérieures.

Les classes de taille sont compatibles avec les versions antérieures lorsque:
- L'application est construite avec 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 de la composante de hauteur n'est pas compacte

Comme iOS 7 ne respecte pas quelques classes de taille, vous rencontrerez des problèmes si vous les utilisez. Par exemple: lorsque vous avez défini Compact w Any h, puis Compact w Compact h, sur iOS 7, il respectera Compact w Any h, mais sur iOS 8, il restituera l'apparence de Compact w.

Donc, si vous souhaitez utiliser ces deux classes de taille et maintenir la compatibilité avec iOS 7, je souhaite effectuer les optimisations que vous souhaitez pour iPhone en mode Paysage dans Tous les types ou Réduire les types, puis effectuez vos autres optimisations pour différentes classes de tailles. Si nécessaire, vous éviterez ainsi d’utiliser des classes de taille compactes et d’éviter les problèmes.

151
Jordan H

Lors du déploiement de votre application sur iOS 7, Xcode compilera votre storyboard de deux manières différentes:

  • Pour l'iPhone, votre story-board est compilé en tant que "Compact-Regular" (largeur compacte, hauteur normale), et il est présenté sous la forme de votre "~ iphone" nib.

  • Pour iPad, votre story-board est compilé en tant que "Régulier-Régulier" et est emballé sous la forme de votre "~ ipad" nib.

Ainsi, si vous souhaitez déployer à la fois 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 pouvez bien entendu modifier la disposition 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 les verrez pas sur iOS 7.

68
Dave DeLong

Remarque: cette réponse concernait une version bêta de Xcode 6 et n'est plus applicable à la version de livraison. Voir les réponses par Joey et Dave DeLong sur cette page pour l'information correcte.

(réponse originale conservée ci-dessous):


Alors que Storyboards/XIBs Configuré pour utiliser des classes de taille s'exécutera sur iOS 7, Le système d'exploitation ne respecte pas actuellement ces size 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 centré vertically and horizontally Dans la classe de taille N'importe quel lecteur, mais aligné sur le coin supérieur gauche de la classe de taille Compact/Compact (par exemple iPhone en paysage). L'assistant de prévisualisation de Xcode montre que le bouton change de position dans iOS 8, Mais pas iOS 7. J'ai également confirmé ce comportement sur un périphérique iOS 7.

27
remmah

Alors que certaines des réponses et des commentaires discutaient de la nature de la compatibilité ascendante, j'ai pensé partager un extrait directement de Documentation Apple:

~~~~~

Déploiement d'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 compatibles avec les versions antérieures lorsque:

  • L'application est construite avec 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 height n'est pas compacte

~~~~~

Ce dernier point concerne la discussion, où Apple confirme que tant que "hauteur compacte" est pas utilisé , il devrait conserver une compatibilité ascendante.

J'espère que cela aide quelqu'un!

12
radiovisual

Tout en abordant le même problème, j'ai trouvé une autre réponse que je n'ai pas encore vue ici. On dirait que les classes de taille dans les fichiers XIB ne fonctionnent pas du tout. Si je crée un prototype de cellule dans le fichier storyboard, cela fonctionne dans iOS7 comme expliqué dans d'autres réponses. Toutefois, lorsque la même cellule prototype est déplacée dans des classes distinctes XIB, les classes de taille de fichier sont ignorées dans iOS7.

Voici un 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

enter image description here

Cela fonctionne bien dans le simulateur iOS8 pour XIB et Storyboard, et dans iOS7, seules les cellules définies dans Storyboard sont soumises aux contraintes mises à jour sur iPad:

enter image description here

3
sha

Si cela fait gagner du temps à tout le monde, je crois que la manière dont Xcode 6 offre une compatibilité quasi-arrière pour les classes de taille se fait via l'historique ~ipad et ~iphone storyboards suffixés, et rien de plus. Cela a du sens, car les classes de taille constituent une manière plus abstraite de définir un storyboard iPad et un storyboard iPhone.

Donc:

  • Si votre objectif est d'utiliser des classes de taille pour prendre en charge des dispositions spécifiques à une famille de périphériques (iPad ou iPhone), vous avez de la chance: les classes de taille constituent une interface plus agréable pour la méthode précédemment prise en charge.

  • Si votre objectif est d’utiliser des classes de taille afin de prendre en charge des présentations modifiées pour différents modèles de la famille identique, c’est-à-dire. iPhone 5/6/6 + inc. paysage, alors vous êtes sans chance. Leur utilisation nécessiterait une cible de déploiement iOS 8 minimale.

2
Jonathan Crooke

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 s'il s'agit du mauvais endroit.

J'ai préparé une question spécifique à cet effet: Exemple pour l'interface utilisateur adaptative en portrait de paysage iPhone qui est rétrocompatible avec iOS 7

D'après ce que j'ai appris jusqu'à présent, je pense maintenant que, comme dans mon exemple, il n'est pas possible d'avoir deux contraintes distinctes pour un élément d'interface utilisateur en mode portrait et paysage avec l'iPhone iOS7 en fonction des classes de taille. Serais heureux si je me trompe, cependant.

1
Tom Major

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

1
Ash R