NSLayoutConstraints code pour centre un point de vue et de maintenir son ratio d'aspect
J'aimerais que mon sous-vue d'être en 16:9 rectangle centré au-dessus de la superview. En d'autres termes, j'aimerais qu'il:
- être aussi large que c'est superview, mais pas plus large que 400px (INTERFACE utilisateur peut faire pivoter en mode paysage),
- être centré horizontalement lorsqu'il est plus étroit que c'est superview,
- ont c'est top épinglé à son superview du haut, et
- modifier la hauteur pour maintenir un aspect ratio 16:9.
Ce code ne fait presque ça, sauf que je vais avoir du mal à se faire horizontale contraintes de travailler et de ne pas être sur ou sous contrainte...
- (void)viewDidLoad
{
[super viewDidLoad];
//Do any additional setup after loading the view.
UIView *contentView = [[UIView alloc] init];
contentView.backgroundColor = [UIColor redColor];
[self.view addSubview:contentView];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
NSDictionary *views = NSDictionaryOfVariableBindings(contentView);
NSMutableArray *constraints = [NSMutableArray array];
//this layout string is more like 'wishful coding'. I don't see why it wouldn't work
//but clearly this one is the problem
[constraints addObjectsFromArray:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-(>=0)-[contentView(<=400)-(>=0)-]"
options:0 metrics:0 views:views]];
//this centering constraint below almost does the job, but doesn't give me a way
//to specify width, changing the one above to just @"H:[contentView(<=400)]"
//doesn't work either
[constraints addObject:
[NSLayoutConstraint constraintWithItem:contentView
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterY
multiplier:1.f constant:0.f]];
//9:16 works fine, I think
[constraints addObject:
[NSLayoutConstraint constraintWithItem:contentView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:contentView attribute:NSLayoutAttributeWidth
multiplier:9.0/16.0 constant:0.0]];
//pin the tops works fine, I think
[constraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[contentView]"
options:0 metrics:0 views:views]];
[self.view addConstraints:constraints];
}
Vous devez vous connecter pour publier un commentaire.
Si vous voulez le centre de la zone rouge à l'horizontale, alors vous voulez assimiler les points de vue " CenterX, pas CenterY. De sorte que la contrainte devrait ressembler à ceci:
Puis sur la première contraintes, les contraintes que vous avez il y a ambiguë, car il y a plus d'une façon de satisfaire à
>=0
de marge de chaque côté et<=400
en largeur. Une meilleure façon serait de dire exactement ce que vous avez dit dans votre question, qui est ce que vous besoin la largeur <=400 et vous comme les marges à 0, si possible.Donc quelque chose comme ceci:
Je crois que vous avez ce que vous voulez?
Parfois, je pense qu'il y a une autre solution, j'ai copié ma solution ici.
Si vous voulez l'Alignement Horizontal, simplement l'utiliser
[parentView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
Si vous voulez de l'Alignement Vertical , simplement l'utiliser
[parentView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
Et cette solution fonctionne pour moi, j'espère que je partage à quelqu'un d'autre.