objective-c ios xcode nslayoutconstraint

objective-c - constraints programmatically swift 4



NSLayoutConstraints y establecer el ancho/alto de una vista dinĂ¡micamente (5)

Tengo una pregunta sobre cómo configurar el tamaño de una vista a la que estoy aplicando algunas restricciones de diseño.
¿Cómo puedo definir el tamaño de la vista sin definir su marco?

Intento crear una vista que tenga su altura fija y tenga un origen en el origen de la pantalla. Rellena el ancho de la vista, de modo que cuando el dispositivo gira la vista se extiende al ancho de la pantalla. Esto es lo que tengo hasta ahora ...

self.containerView = [[HitTestContainerView alloc] init]; [self.containerView setBackgroundColor:[UIColor redColor]]; [self.view addSubview:self.containerView]; NSDictionary *viewsDictionary = @{@"view":self.containerView}; NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" options:0 metrics:nil views:viewsDictionary]; NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:viewsDictionary]; [self.view addConstraints:verticalConstraints]; [self.view addConstraints:horizontalConstraints];

El problema es que no puedo hacer que aparezca nada en la pantalla a menos que configure el marco de ese containerView . ¿Cuál es la forma correcta de hacer esto sin usar Interface Builder?


Escribí una pequeña herramienta que te ayudará con esto:

http://autolayoutconstraints.com

Aquí está la respuesta a su pregunta autogenerada por la herramienta.

C objetivo

// align view from the left and right [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; // width constraint [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view(==250)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; // height constraint [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view(==50)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

Rápido

// align view from the left and right self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view])); // width constraint self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[view(==250)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view])); // height constraint self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[view(==50)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view]));


Mejor tarde que nunca...

Para Storyboard, IB y Swift:

Simplemente controle y arrastre su restricción como cualquier otro control a su viewController

@IBOutlet weak var spaceToTopThatIDecided: NSLayoutConstraint!

luego cambiarlo simplemente:

spaceToTopThatIDecided.constant = 44

¡Eso es todo!


Para definir el alto y el ancho de una vista usando restricciones de diseño, usted, uh, define el alto y el ancho de la vista usando restricciones de diseño. Por ejemplo, ya estás diciendo:

NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" options:0 metrics:nil views:viewsDictionary];

Así que puedes cambiar eso a

NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(50)-[view(40)]" options:0 metrics:nil views:viewsDictionary];

Ahora la vista tendrá 50 píxeles desde la parte superior de su vista de supervisión y 40 píxeles de altura.

Alternativamente, puede usar constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: para establecer la restricción de altura; el toItem será nulo, por supuesto, ya que no hay relación con otro punto de vista.


no tienes que usar los métodos addConstraints :()

- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_MAC(10_7);

// Este método está en desuso y debe evitarse. En su lugar, establezca la propiedad activa de NSLayoutConstraint en YES.

- (void)addConstraints:(NSArray *)constraints NS_AVAILABLE_MAC(10_7);

// Este método está en desuso y debe evitarse. En lugar de usar

+[NSLayoutConstraint activateConstraints:].

// son tan necesidad de usar

+ (void)activateConstraints:(NSArray *)constraints NS_AVAILABLE(10_10, 8_0);

// luego establecer como

NSView *view,*containerView; view =//superview containerView=//subview [view addSubview:containerView];

// añadiendo restricciones

[containerView setTranslatesAutoresizingMaskIntoConstraints:NO];

// sobre esto leído de la documentación de Apple

// luego agrega restricciones como

[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-50-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(containerView)]]; [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(containerView)]];

// Eso es.


Swift 4: puede administrar el ancho y la altura, además de los espacios iniciales, finales y superiores e inferiores solo con las siguientes 2 opciones

//1 . left and right spacing theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[view]-16-|", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView])) //2. top and bottom spacing theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[view]-16-|", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

O Para ser más específico y tener restricciones separadas para W, H, espaciado a la izquierda, espacio superior, puede hacer lo siguiente

//left only spacing theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[view]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView])) //top only spacing theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[view]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView])) //width theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[view(==130)]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView])) //height theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[view(==100)]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))