He utilizado el diseño automático para mis controladores de vista. Establecí 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 si bien administra la brecha lateral izquierda y derecha, se estira en el iPhone 6 y 6 Plus ya que la altura es fija. ¿Cómo puedo aumentar el tamaño de acuerdo con 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 la relación de aspecto en el código?
Respuestas:
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))
fuente
[self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
self.yourview.intrinsicContentSize
Layout Anchors es la forma más conveniente de establecer restricciones mediante programación.
Supongamos que desea establecer una relación de aspecto de 5: 1 para su botón, entonces debe 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 } }
Estos son los resultados obtenidos con el código escrito anteriormente. Puede ver que el botón mantiene su relación de aspecto de 5: 1 en varios dispositivos:
fuente
Swift 3:
yourView.addConstraint(NSLayoutConstraint(item: yourView, attribute: .height, relatedBy: .equal, toItem: yourView, attribute: .width, multiplier: 9.0 / 16.0, constant: 0))
fuente
aspectRatioConstraint.isActive = true
.width
como primer atributo? El resultado es queattr2 * multiplier
la relación de aspecto eswidth / height
, por lo tantowidth = height * aspectRatio
, si ponemos el.height
al primer atributo y elaspectRatio
almultiplier
, el resultado es totalmente inverso.Puede establecer "Restricción de altura" en tiempo de diseño en Interface Builder. Simplemente marque "Eliminar en el momento de la compilación" y se eliminará cuando la aplicación se ejecute.
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]];
fuente
Extensión auxiliar en UIView
extension UIView { func aspectRation(_ ratio: CGFloat) -> NSLayoutConstraint { return NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: self, attribute: .width, multiplier: ratio, constant: 0) } }
Y el uso es:
view.aspectRation(1.0/1.0).isActive = true
fuente
.self
lugar deself
2. Y el uso en el comentario debería serview.aspectRation(1.0/1.0).isActive = true
Probé esto en Xcode 10.2.1 Swift 5.Probé 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()
fuente
Para las vistas, hay restricciones y también propiedades.
la relación de aspecto es una propiedad de la vista , por lo que puede configurarla usando el modo de contenido, así
imageView.contentMode = .scaleAspectFit
esto logrará que una vista no cambie las proporciones si, por ejemplo
fuente
view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: aspectRatio, constant: 0)
así