Comment L'UIs adaptatif Xcode 6 peut-il être rétrocompatible avec iOS 7 et iOS 6?

je viens de regarder la vidéo de la WWDC #216, "Building Adaptive UI with UIKit."

, À environ 45:10 Tony Ricciardi pourparlers sur les changements de l'IB dans Xcode 6 à soutenir les nouveaux changements.

dit-il "vous pouvez déployer ces documents à l'envers vers les anciennes versions d'iOS".

(où" ces documents "signifie probablement des "XIBs" et des "storyboards" qui ont des réglages spécifiques pour différentes classes de taille.)

Je ne suis pas prise de cette place. Allez voir 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 dépendant des constructions UI qui sont 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 fonctionneront sur iOS 6, 7 et 8, et profiter des nouvelles fonctionnalités de mise en page de L'interface utilisateur qu'Apple a ajoutées Xcode 6. J'ai moi-même créé la logique adaptative de L'UI en code, et c'est pas mal de travail.

137
demandé sur Duncan C 2014-06-12 01:26:32

8 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 les tailles de police pour la largeur régulière de la hauteur et ces contraintes modifiées sont visibles dans le simulateur iPad tournant 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. Ceci a été confirmé par Apple et est maintenant indiqué directement dans la documentation :

pour les applications supportant des 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 rétrocompatibles lorsque:

- L'application est construite en utilisant Xcode version 6 ou plus tard

- L'objectif de déploiement de l'app est antérieur à iOS 8

- Les classes de taille sont spécifiés dans un storyboard ou xib

- La valeur de la composante hauteur n'est pas compacte

parce que iOS 7 ne respecte pas quelques classes de taille, si vous les utilisez, vous rencontrerez des problèmes. Exemple: Lorsque vous avez Compact w N'importe quel h défini et puis Compact w Compact h défini, sur iOS 7 il respectera le Compact W N'importe quel h mais sur iOS 8 Il rend le Compact W Compact h l'apparence.

Donc, si vous voulez utilisez ces deux classes de taille et de maintenir la compatibilité avec iOS 7, je ferais toutes les optimisations que vous souhaitez pour iPhone in landscape dans N'importe quel w H ou Compact w N'importe h, puis effectuer vos autres optimisations pour différentes classes de taille que nécessaire, et de cette façon, vous ne aurez pas besoin d'utiliser n'importe quelle classe de taille avec la hauteur compacte et éviterez les problèmes.

151
répondu Joey 2014-11-20 00:03:19

lors du déploiement de votre application sur iOS 7, Xcode compilera votre storyboard de deux façons différentes:

  • pour iPhone, votre storyboard est compilé comme "Compact-régulier" (Largeur compacte, hauteur régulière), et cela est emballé comme votre "~iphone " nib.

  • pour iPad, votre storyboard est compilé comme " Regular-Regular "et est empaqueté comme votre" ~ipad " nib.

donc si vous cherchez à déployer à la fois iOS 7 et iOS 8, Vous devriez concentrer votre conception sur les Compact-Any et régulier-toutes les classes de taille. Cela vous donnera la meilleure expérience en termes d'appariement de L'interface utilisateur à travers les cibles de déploiement. Vous pouvez bien sûr modifier la mise en page pour d'autres classes de taille, mais à moins que ces modifications ne soient appliquées aux classes de taille compacte-régulière ou régulière-régulière, vous ne verrez pas ces modifications sur iOS 7.

68
répondu Dave DeLong 2014-09-11 19:24:14

Note: Cette réponse concernait une version bêta du Xcode 6 et ne s'applique plus à la version d'expédition. Voir les réponses de Joey et Dave DeLong sur cette page pour obtenir les renseignements appropriés.

(réponse initiale retenue ci-dessous):


alors que Storyboards/XIBs configuré pour utiliser les classes de taille s'exécutera sur iOS 7 , L'OS ne respecte pas actuellement ces size classes et semble utiliser la classe de taille par défaut "Any/Any".

je suis d'accord que la diapo particulière à 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 n'importe quelle taille, mais aligné sur le coin supérieur gauche dans le Classe de taille compacte / compacte (par exemple iPhone in landscape). L'Assistant de prévisualisation de Xcode montre que le bouton change de position dans iOS 8 , mais pas iOS 7 . J'ai aussi confirmé ce comportement sur un appareil iOS 7 .

27
répondu remmah 2017-05-23 10:29:56

comme certaines des réponses et des commentaires parlaient de la nature de la rétrocompatibilité, j'ai pensé que je partagerais un extrait directement de la documentation Apple :

~~~~~

déployer une application avec des classes de taille sur les Versions précédentes de iOS

pour les applications supportant des versions d'iOS antérieures à iOS 8, la plupart des classes de taille sont rétro-compatible.

les classes de Taille sont rétro-compatibles, lorsqu':

  • l'application est construite en utilisant Xcode version 6 ou plus tard
  • l'objectif de déploiement de l'application est antérieur à iOS 8
  • les classes de dimension sont spécifiées dans un storyboard ou xib
  • la valeur de la composante de hauteur n'est pas compacte

~~~~~



Ce dernier point est ciblé sur cette discussion, où Apple confirme que aussi longtemps que "compact height" est et non utilisé , il devrait maintenir une rétrocompatibilité.

Espérons que cela aide quelqu'un!

12
répondu radiovisual 2014-12-23 12:57:24

en traitant de la question similaire, j'ai trouvé une autre réponse que je n'ai pas encore vu 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, cependant quand la même cellule prototype est déplacée dans des classes de taille de fichier XIB séparées 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. Chaque est configuré de la même manière: Tout/Tous - 10, Régulier/Regular - 20

enter image description here

il fonctionne très bien dans le simulateur iOS8 pour XIB et Storyboard, et dans iOS7 seules les cellules définies dans Storyboard obtient mis à jour les contraintes sur iPad:

enter image description here

3
répondu sha 2014-10-24 16:23:32

si cela fait gagner du temps à quelqu'un, je crois que la façon dont le Xcode 6 fournit une quasi-rétrocompatibilité pour les classes de taille est via les historiques ~ipad et ~iphone Story-boards suffixés, et rien de plus. Cela a du sens puisque les classes de taille sont une façon plus abstraite de définir un storyboard iPad, et un storyboard iPhone.

donc:

  • Si votre but est d'utiliser classes de taille pour supporter les layouts spécifiques à la famille d'appareils (iPad vs. iPhone), alors vous êtes dans la chance: classes de taille sont une interface plus agréable à la méthode précédemment prise en charge.

  • si votre but est d'utiliser des classes de taille pour supporter des mises en page modifiées pour différents modèles de la famille de dispositifs même - c.-à-d. iPhone 5/6/6 + inc. paysage, alors vous êtes pas de chance . L'utilisation de ceux-ci nécessiterait un minimum de iOS 8 cible de déploiement.

2
répondu Jonathan Crooke 2014-11-04 17:24:20

@lducool - Dans interface builder, l'Identité de l'inspecteur, le changement "Builds" Pour " pour iOS7.1 et plus tard.

1
répondu Ash R 2014-09-23 10:20:30

malheureusement, les réponses de Dave et Joey ne marchent pas pour moi. Je ne suis pas autorisé à commenter dans ce fil, alors s'il vous plaît pardonnez-moi si c'est le mauvais endroit.

j'ai inventé une question spécifique pour que: exemple pour iPhone portrait Adaptive UI paysage qui est rétro-compatible avec iOS 7

de ce que j'ai appris jusqu'à présent, je crois maintenant que, comme dans mon exemple, il n'est pas possible d'avoir 2 séparé, différentes contraintes pour un élément de l'interface utilisateur en mode portrait et paysage avec iPhone iOS7 basé sur les classes de taille. Serait heureux si je me trompe, bien que.

1
répondu Tom Major 2017-05-23 12:34:54