translatesautoresizingmaskintoconstraints ios autolayout nslayoutconstraint

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];