iOS Vues de l'espace uniformément


Exemple

entrer la description de l'image ici

Il est courant de vouloir que deux vues soient côte à côte, centrées dans leur superview. La réponse commune donnée à Stack Overflow est d'incorporer ces deux vues dans un UIView et de centrer le UIView . Ce n'est pas nécessaire ou recommandé. De la documentation UILayoutGuide :

Il existe un certain nombre de coûts associés à l'ajout de vues factices à votre hiérarchie de vues. Tout d'abord, il y a le coût de la création et du maintien de la vue elle-même. Deuxièmement, la vue factice est un membre à part entière de la hiérarchie des vues, ce qui signifie qu'elle ajoute une surcharge à chaque tâche exécutée par la hiérarchie. Pire encore, la vue factice invisible peut intercepter les messages destinés à d'autres vues, ce qui pose des problèmes très difficiles à trouver.

Vous pouvez utiliser UILayoutGuide pour cela, au lieu d'ajouter les boutons dans un UIView inutile. Un UILayoutGuide est essentiellement un espace rectangulaire pouvant interagir avec Auto Layout. Vous placez un UILayoutGuide sur les côtés gauche et droit des boutons et définissez leur largeur pour qu’ils soient égaux. Cela permettra de centrer les boutons. Voici comment le faire en code:

Format de langage de format visuel

view.addSubview(button1)
view.addSubview(button2)

let leftSpace = UILayoutGuide()
view.addLayoutGuide(leftSpace)

let rightSpace = UILayoutGuide()
view.addLayoutGuide(rightSpace)

let views = [
    "leftSpace" : leftSpace,
    "button1" : button1,
    "button2" : button2,
    "rightSpace" : rightSpace
]

// Lay the buttons and layout guides out horizontally in a line. 
// Put the layout guides on each end.
NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[leftSpace][button1]-[button2][rightSpace]|", options: [], metrics: nil, views: views))

// Now set the layout guides widths equal, so that the space on the 
// left and the right of the buttons will be equal
leftSpace.widthAnchor.constraintEqualToAnchor(rightSpace.widthAnchor).active = true

Style d'ancre

let leadingSpace = UILayoutGuide()
let trailingSpace = UILayoutGuide()
view.addLayoutGuide(leadingSpace)
view.addLayoutGuide(trailingSpace)

leadingSpace.widthAnchor.constraintEqualToAnchor(trailingSpace.widthAnchor).active = true
    
leadingSpace.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true
leadingSpace.trailingAnchor.constraintEqualToAnchor(button1.leadingAnchor).active = true
    
trailingSpace.leadingAnchor.constraintEqualToAnchor(button2.trailingAnchor).active = true
trailingSpace.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true

Vous aurez également besoin d'ajouter des contraintes verticales à cela, mais cela centrera les boutons dans la vue sans ajouter de vues "factices"! Cela évitera au système de perdre du temps CPU pour afficher ces vues "factices". Cet exemple utilise des boutons, mais vous pouvez échanger des boutons pour n'importe quelle vue sur laquelle vous souhaitez imposer des contraintes.

Si vous prenez en charge iOS 8 ou une version antérieure, la méthode la plus simple consiste à ajouter des vues factices masquées. Avec iOS 9, vous pouvez remplacer les vues factices par des guides de mise en page.

Remarque: Interface Builder ne prend pas encore en charge les guides de mise en page (Xcode 7.2.1). Donc, si vous voulez les utiliser, vous devez créer vos contraintes dans le code. Source