Je travaille avec autolayout et des contraintes et j'ai trouvé qu'il existe une option Constrain to margins
dans Xcode 6 qui n'était pas présente dans Xcode 5 et est cochée par défaut.
J'ai créé un projet de test, puis j'ai ajouté un UITableView
sur un ViewController avec le cadre défini à la même taille que la vue et ajouté des contraintes.
Xcode 6 Vous pouvez voir ici même si tableview a le même cadre que celui-ci. Xcode suggère d’ajouter -16 comme contrainte, alors que Xcode 5 suggère d’ajouter un espacement 0.
Désormais, lorsque vous décochez l'option "Contraindre à la marge", elle se comporte de la même façon que Xcode 5 et suggérerait d'ajouter 0 comme contrainte.
En outre, j'ai constaté qu'une fois que j'ajoutais une contrainte avec Constrain à la marge vérifiée, je ne pouvais plus ouvrir le fichier de scénario dans Xcode 5; c'est donc définitivement une nouveauté dans Xcode 6.
J'espère pouvoir expliquer ma question correctement. Je voudrais comprendre ce que "contraindre à la marge" fait réellement et quand je devrais et ne devrais pas l'utiliser. Je m'excuse si c'est quelque chose de très simple et évident.
EDIT
J'ai trouvé quelque chose à propos des marges de mise en page dans discussion ici , je me demande si c'est lié à cela.
Je ne comprends pas du tout pourquoi les gens se plaignent que " Les marges provoqueraient un crash total sur tout ce qui était antérieur à iOS 8. "
Définir vos contraintes relatives à la marge dans un fichier xib ou un storyboard NE FAUT PAS faire planter votre application sur iOS7, et il NE FAUT PAS faire une différence d'interface utilisateur sur votre appareil iOS7 non plus, comme tant que vous ne touchez pas les propriétés
UIView.layoutMargins
etUIView.preservesSuperviewLayoutMargins
dans votre code.
Les marges de présentation représentent le remplissage autour de intérieur d'un UIView
que le système de présentation peut utiliser lors de la présentation de sous-vues - afin de garantir qu'un espace est laissé entre le bord d'une vue et une sous-vue. À cet égard, cela ressemble beaucoup à la propriété de remplissage associée aux blocs en CSS.
Par défaut, une UIView
a des marges de format de 8 points de chaque côté, qui ne peuvent pas être modifiées dans Interface Builder. Toutefois, en définissant la propriété UIView.layoutMargins
dans le code, disponible uniquement sur iOS8, vous pouvez ajuster ces valeurs.
Vous pouvez demander à IB d’afficher les marges avec Editeur> Canevas> Afficher les rectangles de présentation:
Les marges peuvent être utilisées pour aider à organiser vos vues et sous-vues. Chaque UIView
est livré avec des marges par défaut, mais elles n'affectent le placement de la vue que lorsque vous définissez une contrainte liée à une marge.
La seule façon d'utiliser les marges dans Interface Builder consiste à cocher l'option relative à la marge lors de la configuration de vos contraintes. Voici comment vous dirigez votre contrainte vers Utilisez des marges au lieu d'arêtes lors de la présentation de la vue.
Examinons quatre manières différentes de définir une contrainte principale entre une vue et sa sous-vue. Pour chaque contrainte, nous examinons le la première association décrite sera celle de la sous-vue, et la la seconde sera celle de superview. Ce que vous voulez accorder une attention particulière est la vérification et la désactivation du statut de l'option Relative à la marge de chaque extrémité de contrainte, car cela définit si la contrainte est liée à la marge ou au bord de la vue.
Cette nouvelle fonctionnalité (iOS8) ne concerne le développement de l'interface utilisateur que si vous décidez d'utiliser des marges.
En utilisant les marges, vous pouvez ajuster le placement de plusieurs sous-vues partageant une relation commune avec un super aperçu partagé en modifiant la valeur d'une propriété unique. Ceci est une victoire évidente pour la définition de toutes les contraintes associées avec des valeurs fixes, car si vous devez mettre à jour tout l'espacement, au lieu de modifier chaque valeur une à une, vous pouvez simultanément modifier tous les emplacements pertinents en mettant à jour la marge de la vue supérieure avec une seule ligne. code comme celui-ci:
self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);
Pour illustrer cet avantage, dans le cas suivant, tous les bords gauche des sous-vues sont alignés sur la marge gauche de leur vue supérieure. Ainsi, le changement de la marge gauche de Superview affectera toutes les sous-vues en même temps.
Dans iOS 8, vous avez maintenant la possibilité de définir vos contraintes relatives à une marge prédéfinie par rapport aux limites du super aperçu, au lieu des limites du supérieur même. Oui, cela est totalement lié aux marges de mise en page que vous avez indiquées dans la documentation. L'un des avantages est que vous pouvez redéfinir vos marges de manière dynamique ou différemment pour chaque type de périphérique. La mise en page est mise à jour en conséquence sans modification des contraintes.
Quand l'utiliser: quand vous voulez profiter de cette nouvelle flexibilité.
Quand ne PAS l'utiliser: pour toute application destinée à s'exécuter sur iOS 7 ou version ultérieure.
La propriété sur UIView est: layoutMargins
. Voir le Apple Docs . Fondamentalement, si les marges de mise en page sont 8,8,8,8 (valeur par défaut), une contrainte avec 0 espace de début pour la marge de conteneur aura une position x de 8. Notez que cette option est uniquement disponible. sur iOS8 ou ultérieur.
Pour tous ceux qui ne veulent pas que leurs contraintes aillent dans la marge du conteneur:
CTRL + clic + glisser pour afficher la fenêtre contextuelle de création de contrainte.
Si le menu indique par défaut de créer la contrainte à la marge, maintenez la touche option/alt enfoncée pour permettre à la contrainte d'être appliquée au conteneur et non à sa marge.
Maintenant, il va montrer l'option pour créer la contrainte PAS à la marge. C'est COMME plus rapide dans mon utilisation.