66 votes

IOS 11 guide de disposition de zone de sécurité compatibilité ascendante

Est-il possible d'activer les guides de mise en page de la zone de sécurité sur iOS versions antérieures à 11 ?

entrer la description de l'image ici

6 votes

Le premier résultat Google pour "guide d'aménagement de la zone de sécurité" est useyourloaf.com/blog/safe-area-layout-guide, où il est affirmé que "... vous pouvez passer à l'utilisation du guide d'aménagement de la zone de sécurité dans Interface Builder même si vous ciblez toujours iOS 10 et les versions antérieures."

3 votes

Y a-t-il une raison spéciale de taguer la question avec [iphone-x] ?

2 votes

Je crois savoir pourquoi, sur iPhoneX, une barre d'onglets se déréglera sans safeareaInsets

55voto

thijsonline Points 34

J'ai réussi à travailler avec les nouveaux guides de mise en page de la zone de sécurité et maintenir la compatibilité avec les anciennes versions iOS 9 et iOS 10 : (ÉDIT : comme souligné dans les commentaires par @NickEntin, cette implémentation présumera qu'une barre d'état est présente, ce qui ne sera pas vrai en mode paysage sur l'iPhone X. Résultant en trop d'espace en haut (20 points). Cela fonctionnera parfaitement cependant.

Par exemple, si vous voulez qu'une vue soit à 10 points en dessous de la barre d'état (et à 10 points en dessous du boîtier du capteur sur l'iPhone X) :

  1. Dans votre XIB, allez dans Inspecteur de fichier et activez la zone de sécurité en cochant Utiliser les guides de mise en page de la zone de sécurité.
  2. Créez une contrainte du haut de la vue vers le haut de la vue principale, avec une contrainte >= (supérieure ou égale), constante 30 (30 car nous voulons un espacement de 10 points jusqu'à la barre d'état qui fait 20 points de hauteur) et priorité Élevée (750).
  3. Créez une contrainte du haut de la vue vers le haut de la Zone de sécurité, avec une contrainte = (égal), constante 10 et priorité Faible (250).

La même chose peut être faite pour une vue en bas (et pour mener/traîner ou à gauche/à droite de la Zone de sécurité) :

  1. Dans votre XIB, allez dans Inspecteur de fichier et activez la zone de sécurité en cochant Utiliser les guides de mise en page de la zone de sécurité.
  2. Créez une contrainte du bas de la vue vers le bas de la vue principale, avec une contrainte >= (supérieure ou égale), constante 10 et priorité Élevée (750).
  3. Créez une contrainte du bas de la vue vers le bas de la Zone de sécurité, avec une contrainte = (égal), constante 10 et priorité Faible (250).

1 votes

Intéressant, avez-vous remarqué que sur iPhoneX, il n'y a pas de barre d'état en mode paysage même si l'application veut l'afficher? Si mon observation est correcte, alors la contrainte de priorité supérieure pour couvrir la barre d'état prendra le dessus sur 0 pour la zone de sécurité et cela ne semblera pas très bien sur iPhoneX.

1 votes

@NickEntin merci d'avoir remarqué. Autant que je sache, la barre d'état est en effet toujours cachée en mode paysage sur l'iPhone X, et cette implémentation ne gère pas cela (agissant comme si la barre d'état était réellement là).

2 votes

La disposition sécurisée est la vue principale dans xcode 9. Comment allons-nous appliquer le point 2 ? Ici, pour 2 et 3, ne créerions-nous pas des contraintes avec la même vue ?

48voto

Dobster Points 465

La compatibilité ascendante de Safe Areas pour iOS 9 et iOS 10 ne fonctionne que si vous utilisez des storyboards. Si vous utilisez des xibs, il n'y a pas de guide de mise en page sur lequel s'appuyer. https://forums.developer.apple.com/thread/87329

Les solutions de contournement semblent être soit

(a) migrer vos xibs vers des storyboards, ou

(b) ajouter des contraintes supplémentaires de manière programmatique.

Si (a) n'est pas vraiment une option, l'approche manuelle sera quelque chose comme ceci:

En supposant que vous avez une vue dans votre xib que vous voulez maintenir dans la zone de sécurité (c'est-à-dire sous toute barre de statut ou barre de navigation).

  1. Ajoutez des contraintes dans votre xib entre votre vue et la zone de sécurité pour iOS 11. Attribuez la contrainte supérieure à une priorité de 750.

    ajouter une contrainte supérieure

  2. Dans votre contrôleur de vue, ajoutez une propriété:

    @property (nonatomic, strong) NSLayoutConstraint *topLayoutConstraint;

    Puis dans viewDidLayoutSubviews:

    - (void)viewDidLayoutSubviews {
        [super viewDidLayoutSubviews];
    
        if (@available(iOS 11, *)) {
            // contraintes de la zone de sécurité déjà définies
        }
        else {
            if (!self.topLayoutConstraint) {
                self.topLayoutConstraint = [self..topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor];
                [self.topLayoutConstraint setActive:YES];
            }
        }
    }

    La nouvelle contrainte ne sera créée que pour iOS 9 et iOS 10, a une priorité par défaut de 1000, et remplace celle dans le xib.

  3. Répétez pour une contrainte inférieure si vous avez besoin d'éviter l'indicateur de domicile.

Version Swift 4 :

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if #available(iOS 11, *) {
        // contraintes de la zone de sécurité déjà définies
    } else {
        if topLayoutConstraint == nil {
            topLayoutConstraint = .topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor)
            topLayoutConstraint?.isActive = true
        }
    }
}

1 votes

@RawMean #available(iOS 11, *) vérifiera iOS 11 et ultérieur

0 votes

Merci pour la super explication! Inspiré par vos idées, j'ai créé une sous-classe de NSLayoutConstraint qui le rend plus pratique à utiliser car rien n'a besoin d'être implémenté dans chaque viewcontroller où vous pourriez utiliser ce xib. C'est à la toute fin de ce post: stackoverflow.com/a/52145680/4181169

0 votes

Merci. Pourquoi avez-vous mis cela dans viewDidLayoutSubviews au lieu de viewDidLoad?

19voto

clarus Points 2350

Il y a certainement au moins un problème de compatibilité ascendante avec les contraintes de zone de sécurité d'iOS 11 que j'ai observé dans le GM Xcode 9 : les vues poussées avec des contraintes de zone de sécurité.

Si votre barre de navigation est masquée et que vous poussez une vue avec une contrainte de zone de sécurité en haut, la vue poussée chevauchera la barre d'état sur iOS 9 et 10.

Si la barre de navigation est visible et que "sous les barres supérieures" est désactivé, la vue poussée glissera toujours sous la barre de navigation pour atteindre le haut de l'écran. La barre de navigation est placée correctement.

Sur iOS 11, la mise en page sera correcte dans les deux cas.

Voici un exemple simple : http://www.filedropper.com/foobar

Et voici une vidéo avec la barre de navigation masquée (iOS 10.3 à gauche, iOS 11 à droite) : https://vimeo.com/234174841/1e27a96a87

Voici une version où la barre de navigation est visible (activée dans le fichier NIB) : https://vimeo.com/234316256/f022132d57

J'ai signalé cela comme un radar #34477706.

Merci à @Sander d'avoir signalé le cas de la barre de navigation visible.

2 votes

Si la barre de navigation n'est pas cachée, le bug est le même. Sur les versions iOS 9 et 10, la vue poussée est placée sous la barre de navigation. Ou ce cas doit-il être traité différemment?

3 votes

Donc, en termes de solutions de contournement, quelques idées viennent à l'esprit, aucune d'entre elles n'étant géniale, mais... 1) Vous pourriez avoir des nibs/storyboards séparés pour les versions antérieures à iOS 11. Selon la complexité de votre application, cela pourrait être vraiment pénible ou très simple. ou 2) Si la barre de navigation est cachée, avoir une contrainte supérieure à 20 par rapport à la super vue pour les vues qui ont une barre d'état mais pas de barre de navigation (à une priorité de 1000) ainsi que celle de la zone de sécurité (à une priorité de 750). Cela fonctionne et ne devrait pas poser de problèmes à l'avenir. Pour le cas où la barre de navigation est visible, c'est plus compliqué. Je travaille encore sur une bonne solution pour cela.

0 votes

Salut @clarus, merci pour l'information! As-tu reçu une réponse d'Apple?

7voto

Krunal Points 33551

Oui, votre projet/application fonctionnera dans les versions antérieures à iOS 11 sans aucun problème. Dans les versions antérieures à 11, il remplace/considère la mise en page de la zone de sécurité en mise en page automatique normale et suit les règles du guide de mise en page supérieure et inférieure.

J'ai testé mon projet existant avec et sans 'SafeAreaLayout' sur les deux plateformes (iOS 11 et iOS 10 antérieur). Ça fonctionne bien.

Assurez-vous simplement :

  • Si vous avez conçu votre projet/interface utilisateur en mise en page automatique; les contraintes de votre élément d'interface utilisateur suivent/sont relatives au guide de mise en page supérieure et inférieure (pas à la super vue). Donc, en un seul clic (activation) sur l'option de SafeAreaLayout, la mise en page de la zone de sécurité sera automatiquement implémentée correctement pour tous les fichiers Interface Builders dans votre storyboard.

  • Si vous avez conçu votre projet/interface utilisateur en SafeAreaLayout; alors il suivra automatiquement le guide de mise en page supérieure et inférieure dans iOS antérieur.

Voici un exemple de capture d'écran avec le résultat, en activant ou désactivant la mise en page de la zone de sécurité, cela n'affectera pas la conception existante.

Mise en page de la zone de sécurité: entrez la description de l'image ici

Mise en page automatique

entrez la description de l'image ici

**En résumé, la réponse à votre question est : "Activer les guides de mise en page de la zone de sécurité compatible avec iOS antérieur à 11"

Vous pouvez implémenter la mise en page de la zone de sécurité dans votre projet/application et cela fonctionnera bien avec les versions précédentes d'iOS en convertissant la mise en page de la zone de sécurité en mise en page supérieure et inférieure.**

1 votes

Étrangement, le guide de la zone de sécurité ne fonctionne pas pour moi dans iOS 10... il suppose simplement une valeur de 0 et le contenu chevauche la barre d'état. Dans iOS 11, cela fonctionne bien. Une idée pourquoi?

1 votes

Si vous travaillez avec Xcode 9, alors votre mise en page de zone de sécurité se transforme automatiquement en mise en page Top et Bottom pour iOS 10 et les versions antérieures.. Pouvez-vous partager une capture d'écran, pour la mise en page de votre storyboard?

15 votes

Ce que je trouve, c'est que cela le convertit bien dans les storyboards, mais échoue dans les fichiers xib... il ignore simplement la taille de la barre d'état dans iOS 10

7voto

ihar Points 233

Si vous utilisez des fichiers xib sans storyboard, ils n'ont pas de guides de disposition sur ios 10. Déplacez donc le xib dans le storyboard pour assurer la compatibilité ascendante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X