pantalla - ¿Cómo puedo configurar las restricciones de relación de aspecto programáticamente en iOS?
nuevas funciones ios 12 (5)
He usado el diseño automático para mis controladores de vista. He establecido las posiciones V y H en restricciones, pero quiero saber cómo puedo aumentar el tamaño de mi botón cuando cambia a 5s, 6 y 6 Plus. Esta es la forma en que agregué restricciones para el botón de inicio de sesión:
NSArray *btncon_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnLogin(40)]" options:0 metrics:nil views:viewsDictionary];
[btnLogin addConstraints:btncon_V];
NSArray *btncon_POS_H=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[btnLogin]-100-|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_H];
NSArray *btncon_POS_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[Title]-130-[lblFirst]-0-[lblSecond]-20-[textusername]-10-[txtpassword]-10-[btnLogin]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_V];
Pero mi problema es que a pesar de que maneja la brecha lateral izquierda y derecha, se está estirando en iPhone 6 y 6 Plus ya que la altura es fija. ¿Cómo puedo aumentar el tamaño según el tamaño de la pantalla? Creo que esta podría ser la relación de aspecto, pero ¿cómo puedo establecer la restricción de relación de aspecto en el código?
He intentado todas las respuestas anteriores, pero no funcionó, y esta es mi solución con swift 3:
let newConstraint = NSLayoutConstraint(item: yourView, attribute: .width, relatedBy: .equal, toItem: yourView, attribute: .height, multiplier: 560.0/315.0, constant: 0)
yourView.addConstraint(newConstraint)
NSLayoutConstraint.activate([newConstraint])
NSLayoutConstraint.deactivate(yourView.constraints)
yourView.layoutIfNeeded()
Me gusta esto. Trata una vez.
[self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.yourview addConstraint:[NSLayoutConstraint
constraintWithItem:self.yourview
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.yourview
attribute:NSLayoutAttributeWidth
multiplier:(self.yourview.frame.size.height / self.yourview.frame.size.width)
constant:0]];
o en lugar de (self.yourview.frame.size.height / self.yourview.frame.size.width)
puede usar cualquier valor flotante. Gracias.
Swift 3.0 -
self.yourview!.translatesAutoresizingMaskIntoConstraints = false
self.yourview!.addConstraint(NSLayoutConstraint(item: self.yourview!,
attribute: NSLayoutAttribute.height,
relatedBy: NSLayoutRelation.equal,
toItem: self.yourview!,
attribute: NSLayoutAttribute.width,
multiplier: self.yourview.frame.size.height / self.yourview.frame.size.width,
constant: 0))
Puede configurar "Restricción de altura" en tiempo de diseño en Interface Builder. Simplemente marque ''"Eliminar en tiempo de compilación", y se eliminará cuándo se ejecutará la aplicación.
Después de eso, puede agregar la restricción "Relación de aspecto", por ejemplo, en el método viewDidLoad.
En Xamain.iOS para "16: 9" se ve así:
this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create(
this.ImageOfTheDay,
NSLayoutAttribute.Height,
NSLayoutRelation.Equal,
this.ImageOfTheDay,
NSLayoutAttribute.Width,
9.0f / 16.0f,
0));
O, como dijo Mahesh Agrawal :
[self.ImageOfTheDay addConstraint:[NSLayoutConstraint
constraintWithItem:self.ImageOfTheDay
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.ImageOfTheDay
attribute:NSLayoutAttributeWidth
multiplier:(9.0f / 16.0f)
constant:0]];
Swift 3:
yourView.addConstraint(NSLayoutConstraint(item: yourView,
attribute: .height,
relatedBy: .equal,
toItem: yourView,
attribute: .width,
multiplier: 9.0 / 16.0,
constant: 0))
Layout Anchors es la forma más conveniente de establecer restricciones programáticamente.
Digamos que desea establecer una relación de aspecto de 5: 1 para su botón, entonces debería usar:
button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
Aquí está el código completo:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(type: .custom)
button.setTitle("Login", for: .normal)
button.backgroundColor = UIColor.darkGray
self.view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
let margins = view.layoutMarginsGuide
button.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 20.0).isActive = true
button.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: -20.0).isActive = true
button.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: -20.0).isActive = true
button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
}
}
Aquí se obtienen resultados con el código escrito anteriormente. Puede ver que el botón mantiene su relación de aspecto de 5: 1 en varios dispositivos: