Sie sind auf Seite 1von 5

Autolayout Xcode

Las restricciones de Auto Layout pertenecen a la clase privada


NSAutoresizingMaskLayoutConstraint. Las restricciones que el programador aade pertenecen a la
clase pblica NSLayoutConstraint.
ASCII-Art
Utiliza el interface NSLayoutConstraint. Para crear las restricciones, normalmente se usa
constraintsWithVisualFormat:options:metrics:views:. El primer parmetro es un NSString y
proporciona una representacin visual de la disposicin (layout) que quieres conseguir. La vista est
representada por un corchete y la conexin entre vistas est representada por un guin (o dos
guiones separados por un nmero que indica el nmero de puntos entre vistas).
Las vistas de la restriccin se cogen de un diccionario de vistas (la key son los nombres que se usan
en la cadena de formato de la restriccin y los valores son las vistas correspondientes). Por
comodidad, NSDictionaryOfVariableBindings crea un diccionario donde las keys son las mismas
que el nombre de la variable del valor correspondiente:
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(button1, button2);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[button1]-[button2]"
options:0
metrics:nil
views:viewsDictionary];

Hay restricciones que no pueden expresarse visualmente, por ejemplo imageView.width = 2 *


imageView.height. Para crear esta restriccin usar:
constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant. Ejemplo
[NSLayoutConstraint constraintWithItem:button1
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:button2
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:-12.0];

Las restricciones son inmutables, es decir, no se pueden cambiar la mayora de las propiedades de
una restriccin despus de que la hayas creado, pero s uedes cambiar la constante.
Para activar una restriccin, debes aadirla a una vista. NSView proporciona un mtodo llamado
addConstraint para aadir una restriccin y mtodos para eliminar o inspeccionar una restriccin
existente removeConstraint y constraints. NSView tambin proporciona fittingSize que retorna el
tamao ideal para la vista considerando slo las restricciones instaladas en el subrbol recibido y la
condicin de ser lo ms pequea posible.
Lenguaje de Formato Visual
Ejemplos de formatos visuales:

Cuando se est usando el Lenguaje en Formato Visual, la supervista de la vista para la que la
restriccin est siendo descrita es representada por |. Ejemplo:
|-20-[mybutton1]-30-|
El lenguaje tambin permite declarar prioridades:
[mybutton1(>=70@500)]
Intrinsic Content Size

Una restriccin que previene que el tamao de la vista llegue a ser mas grande que el tamao del
contenido (content hugging constraint). La otra restriccin previene que el tamao de la vista se
reduzca menos que el contenido (compression resistance constraint).
Una vista con una alta compression resistance priority y un bajo content huggig priority tendr
permitido crecer pero se resistir a la compresin. De igual forma, una alta compression resistance
priority junto con un alto content hugging priority causar que la vista se resista a cualquier
modificacin de tamao, manteniendo la vista lo ms cerca posible de su tamao intrnseco.
Aadir una restriccin a una vista

Una restriccin referenciando solamente a Label A debe ser aadida a su padre inmediato, en este
caso a View B, pero una restriccin entre Button A y Button B debe ser aadida a su inmediato
padre de ambas que en este caso es View A.
Autoresizing Translation
Cuando se aade una vista a un layout en cdigo, por defecto intentar convertir la mscara de
autotamao a las restricciones de autolayout. Esto puede hacer que haya conflictos con cualquier
restriccin aadida dentro del cdigo de la aplicacin por lo que habra que apagar esta conversin
con setTranslatesAutoresizingMaskIntoConstraints.
Ejemplo: (Crear un Single View Application en Xcode):
- (void)viewDidLoad
{
[super viewDidLoad];
UIView *superview = self.view;
UILabel *mylabel = [[UILabel alloc]init];
[mylabel setTranslatesAutoresizingMaskIntoConstraints:NO];
mylabel.text = @"MyLabel";
UIButton *mybutton = [UIButton
buttonWithType:UIButtonTypeRoundedRect];
[mybutton setTitle:@"My Button"
forState:UIControlStateNormal];
[mybutton setTranslatesAutoresizingMaskIntoConstraints:NO];
[superview addSubview:mylabel];
[superview addSubview:mybutton];
NSLayoutConstraint *myConstraint =[NSLayoutConstraint
constraintWithItem:mylabel
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeCenterY
multiplier:1.0

constant:0];
[superview addConstraint:myConstraint];
myConstraint =[NSLayoutConstraint
constraintWithItem:mylabel
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0];
[superview addConstraint:myConstraint];
myConstraint =[NSLayoutConstraint constraintWithItem:mybutton
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:mylabel
attribute:NSLayoutAttributeLeading
multiplier:1
constant:-10];
[superview addConstraint:myConstraint];
myConstraint =[NSLayoutConstraint constraintWithItem:mybutton
attribute:NSLayoutAttributeBaseline
relatedBy:NSLayoutRelationEqual
toItem:mylabel
attribute:NSLayoutAttributeBaseline
multiplier:1
constant:0];
[superview addConstraint:myConstraint];
}

Se puede eliminar una restriccin usando [self.myview removeConstraint:self.myconstraint].