Actuellement, non, il ne semble pas possible de centrer une vue dans la supervision en utilisant uniquement VFL. Il n'est cependant pas si difficile de le faire en utilisant une seule chaîne VFL et une seule contrainte supplémentaire (par axe):
VFL: "|-(>=20)-[view]-(>=20)-|"
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:view.superview
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f];
On pourrait penser que vous seriez simplement capable de faire ceci (c'est ce que j'ai d'abord pensé et essayé quand j'ai vu cette question):
[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"view" : view}];
J'ai essayé de nombreuses variantes différentes de ce qui précède en essayant de le plier à ma volonté, mais cela ne semble pas s'appliquer à la supervision, même lorsque vous avez explicitement deux chaînes VFL séparées pour les deux axes ( H:|V:
). Je me suis alors commencé à essayer et d' isoler exactement quand les options ne s'appliquent à la VFL. Ils semblent ne pas s'appliquer à la supervision dans le VFL et ne s'appliqueront qu'aux vues explicites mentionnées dans la chaîne VFL (ce qui est décevant dans certains cas).
J'espère qu'à l'avenir, Apple ajoutera une sorte de nouvelle option pour que les options VFL prennent en compte la supervision, même si elle ne le fait que lorsqu'il n'y a qu'une seule vue explicite en plus de la vue dans la VFL. Une autre solution pourrait être une autre option passée dans le VFL qui dit quelque chose comme: NSLayoutFormatOptionIncludeSuperview
.
Inutile de dire que j'ai beaucoup appris sur VFL en essayant de répondre à cette question.
|
et[superview]
comme des entités internes distinctes même si elles représentent le même objet sémantique. En utilisant[superview]
, la mise en page automatique inclut l'objet superview dans ses métriques d'alignement (dans le cas de sa réponse au lien github, c'est la métriqueNSLayoutFormatAlignAllCenterY
/X
).Oui, il est possible de centrer une vue dans sa supervision avec Visual Format Language. À la fois verticalement et horizontalement. Voici la démo:
https://github.com/evgenyneu/center-vfl
la source
Je pense qu'il vaut mieux créer manuellement des contraintes.
Maintenant, nous pouvons utiliser NSLayoutAnchor pour définir par programme AutoLayout:
(Disponible dans iOS 9.0 et versions ultérieures)
Je recommande d'utiliser SnapKit , qui est un DSL pour faciliter la mise en page automatique sur iOS et macOS.
la source
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
Absolument possible a pu le faire comme ceci:
J'ai appris cela d' ici. Le code ci-dessus centre évidemment la sous-vue par Y.
Swift3:
la source
Ajoutez le code ci-dessous et placez votre bouton au centre de l'écran. Absolument possible.
la source
Je sais que ce n'est pas ce que vous voulez mais vous pouvez bien sûr calculer les marges et les utiliser pour créer la chaîne de format visuel;)
Bref, non. Malheureusement, il n'est pas possible de faire cela «automatiquement» avec VFL - du moins pas encore.
la source
Grâce à la réponse de @Evgenii, je crée un exemple complet dans l'essentiel:
centrer le carré rouge verticalement avec une hauteur personnalisée
https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626
Vous pouvez centrer une vue verticalement en utilisant soit VFL (ce qui n'est pas tout à fait intuitif) ou utiliser des contraintes manuellement. À propos, je ne peux pas combiner à la fois centerY et height en VFL comme:
Dans la solution actuelle, les contraintes VFL sont ajoutées séparément.
la source
Ce qu'il faut faire, c'est que superview doit être déclaré dans le dictionnaire. Au lieu d'utiliser,
|
vous utilisez@{@"super": view.superview};
.Et
NSLayoutFormatAlignAllCenterX
pour vertical etNSLayoutFormatAlignAllCenterY
pour horizontal en option.la source
Vous pouvez utiliser des vues supplémentaires.
Si vous le voulez bien, alors
centerXView.hidden = centerYView.hidden = YES;
.PS: Je ne suis pas sûr de pouvoir appeler les vues supplémentaires des "espaces réservés", car l'anglais est ma deuxième langue. Ce sera apprécié si quelqu'un peut me le dire.
la source
Pour ceux qui sont venus ici pour une
Interface Builder
solution basée (Google me conduit ici), ajoutez simplement des contraintes de largeur / hauteur const, et sélectionnez la sous-vue -> faites glisser le contrôle vers sa supervision -> sélectionnez "centrer verticalement / horizontalement dans superview".la source
C'est ma méthode
la source
Je dois juste dire que vous pouvez utiliser ceci au lieu de contraintes:
la source
Réponse @ igor-muzyka dans Swift 2 :
la source
Au lieu d'utiliser VFL, vous pouvez facilement le faire dans le générateur d'interface. Dans le Storyboard principal, ctrl + clic sur la vue que vous souhaitez centrer. Faites glisser vers la vue supervisée (tout en maintenant la touche Ctrl enfoncée) et sélectionnez "Centre X" ou "Centre Y". Aucun code nécessaire.
la source