ios - translatesautoresizingmaskintoconstraints - Crear restricciones de diseño automático para topLayoutGuide y bottomLayoutGuide en el código
swift constraints programmatically (4)
La documentation de Apple sobre la creación de restricciones de diseño automático entre una vista y una de las guías de diseño solo muestra un ejemplo usando VFL .
¿Hay alguna forma de crear estas restricciones programáticamente sin VFL (usando la otra API de NSLayoutConstraint
o similar)?
(Nota: estoy preguntando específicamente sobre hacer esto en código, no en Interface Builder. Y no quiero que la length
calculada de la guía se establezca como una constante estática en una restricción, quiero una restricción donde los cambios a la guía de diseño la longitud provocaría automáticamente que la vista restringida ajuste la posición).
Esta es una gist que he creado, se supone que debes insertar todas tus subvistas en una vista de tanque (vista de contenedor) agregada a un xib, elimina restricciones de vista de tanque-superview xib y agrega una restricción superior a topLayoutGuide dando un aspecto de iOS6. Podría ser interesante para lo que quieres lograr.
//This should be added before the layout of the view
- (void) adaptToTopLayoutGuide {
//Check if we can get the top layoutguide
if (![self respondsToSelector:@selector(topLayoutGuide)]) {
return;
}
//tankView is a contaner view
NSArray * array = [self.tankView referencingConstraintsInSuperviews]; //<--For this method get the Autolayout Demistified Book Sample made by Erica Sadun
[self.view removeConstraints:array];
NSArray * constraintsVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide]-0-[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView, @"topLayoutGuide":self.topLayoutGuide}];
[self.view addConstraints:constraintsVertical];
NSArray * constraintsHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tankView]|" options:0 metrics:nil views:@{@"tankView": self.tankView}];
[self.view addConstraints:constraintsHorizontal];
}
Para complementar la respuesta de @ JamieMcDaniel, la versión de Swift + iOS9 sería:
self.button.topAnchor
.constraintEqualToAnchor( self.topLayoutGuide.bottomAnchor ).active = true
No olvides la parte .active = true
ya que de lo contrario la restricción no se activará automáticamente.
Para un UIButton
que desee colocar 20 puntos debajo de UIViewController.topLayoutGuide
, cree NSLayoutConstraint
como NSLayoutConstraint
:
[NSLayoutConstraint constraintWithItem:self.button
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.topLayoutGuide
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:20.0];
Con iOS 9 también puedes crear el NSLayoutConstraint
esta manera:
[self.button.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor
constant:20.0];
Solo una adición a @Jamie McDaniel, en caso de que no sea inmediatamente obvio, debe agregar la restricción que sugiere crear:
NSLayoutConstraint *buttonTopConstraint = [NSLayoutConstraint constraintWithItem:self.button
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.topLayoutGuide
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:20.0];
[self.view addConstraint:buttonTopConstraint];