sketch guide español developer apple adaptive iphone ios autolayout

iphone - guide - iOS: coloque UIView en el centro de supervisión con Programación automática



swift constraints programmatically (2)

¿Cómo se configura programáticamente una UIView para estar en el centro de su supervisión con Auto Layout?

UIButton* viewObj = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [viewObj setTranslatesAutoresizingMaskIntoConstraints:NO]; [viewObj setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:viewObj]; NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:viewObj attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]; [self.view addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:viewObj attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]; [self.view addConstraint:cn];

El código anterior funciona para mí para UIButton, pero tengo problemas para reemplazar la primera línea con algo que funciona para una vista UIV.

He intentado

UIView* viewObj = [UIView alloc] initWithFrame:CGRectZero];

pero la vista no aparece en el simulador.

¿Alguna sugerencia?

¡Gracias!


Dado que hizo esta pregunta en el contexto del uso de Auto Layout, el problema aquí es que un UIButton tiene un tamaño intrínseco (comunicado a través del método intrinsicContentSize) que proporciona al Auto Layout información sobre el ancho y la altura, pero una vista de UIV normalmente no. Así que necesitas agregar más restricciones relacionadas con el ancho y la altura.

Si desea que su UIView sea un tamaño establecido (por ejemplo, 200x200), podría agregar estas líneas:

cn = [NSLayoutConstraint constraintWithItem:viewObj attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:200]; [viewObj addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:viewObj attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:200]; [viewObj addConstraint: cn];

Tenga en cuenta que el argumento toItem: es nil y el segundo atributo es NSLayoutAttributeNotAnAttribute , porque no está especificando el ancho y el alto en relación con cualquier otra cosa. Si desea que la altura y el ancho de la subvista sean relativos a la supervisión (por ejemplo, 0.5), puede hacer esto:

cn = [NSLayoutConstraint constraintWithItem:viewObj attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]; [self.view addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:viewObj attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0]; [self.view addConstraint: cn];


UIButton , UIImageView , UIlabel y UITextField pueden establecer automáticamente su tamaño de acuerdo con sus propiedades de contenido. El ancho y el alto de un UIImageView están establecidos por el UIImage que puede contener. El tamaño de una UILabel dependerá de su texto. El ancho y la altura de un UIButton están definidos por el título y la imagen que tiene (puedes obtener más información al respecto con Tamaño de contenido intrínseco ).

Por lo tanto, cuando desea centrar un UIButton , un UILabel , un UITextField o un UIImageView dentro de un UIView con diseño automático, en casi todos los casos no tiene que crear restricciones para su ancho y alto. Simplemente necesita establecer restricciones horizontales y verticales para ellos.

Sin embargo, con el diseño automático, una UIView que no tiene subvistas no puede confiar en nada para establecer su tamaño a menos que le proporcione algunas restricciones arbitrarias de ancho y altura. Y de acuerdo con sus necesidades, puede resolver esto de 3 maneras diferentes.

El estilo de diseño automático puro.

Aquí, establecemos el ancho y el alto de nuestra UIView directamente como restricciones de diseño automático:

override func viewDidLoad() { super.viewDidLoad() let newView = UIView() newView.backgroundColor = .redColor() newView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(newView) // Auto layout code using anchors (iOS9+) let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor) let verticalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor) let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100) let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100) NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) }

El estilo de máscara de autorización.

Aquí, inicializamos nuestra UIView con su anchura y altura, hacemos que su centro y su centro de supervisión sean iguales y creamos algunas máscaras automáticas. Luego, le pedimos a UIKit que traduzca esas máscaras automáticas en restricciones de diseño automático:

override func viewDidLoad() { super.viewDidLoad() let newView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)) newView.backgroundColor = .redColor() newView.center = CGPointMake(view.bounds.midX, view.bounds.midY) newView.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleTopMargin, .FlexibleBottomMargin] newView.translatesAutoresizingMaskIntoConstraints = true // default is true view.addSubview(newView) }

El estilo de la subclase.

Aquí, creamos una subclase de UIView y UIView su método ( declaration ) intrinsicContentSize() ) para que devuelva el tamaño deseado:

import UIKit class CustomView: UIView { override func intrinsicContentSize() -> CGSize { return CGSize(width: 100, height: 100) } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let newView = CustomView() newView.backgroundColor = .redColor() newView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(newView) let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0) view.addConstraint(horizontalConstraint) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1, constant: 0) view.addConstraint(verticalConstraint) } }