J'ai utilisé la mise en page automatique pour mes contrôleurs de vue. J'ai défini les positions V et H en contraintes, mais je veux savoir comment augmenter la taille de mon bouton lorsqu'il passe à 5s, 6 et 6 Plus. Voici comment j'ai ajouté des contraintes pour le bouton de connexion:
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];
Mais mon problème est qu’alors qu’il gère les écarts latéraux gauche et droit, il est étiré dans les iPhone 6 et 6 Plus puisque la hauteur est fixe. Comment puis-je augmenter la taille en fonction de la taille de l'écran? Je pense que cela pourrait être le rapport d'aspect, mais comment puis-je définir la contrainte de rapport d'aspect dans le code?
Comme ça. Essayez une fois.
[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]];
ou à la place de (self.yourview.frame.size.height / self.yourview.frame.size.width)
vous pouvez utiliser n'importe quelle valeur flottante. Merci.
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))
Ancres de mise en page est le moyen le plus pratique de définir des contraintes par programme.
Supposons que vous souhaitiez définir un rapport hauteur/largeur de 5: 1 pour votre bouton, puis utilisez les éléments suivants:
button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
Voici le code complet:
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
}
}
Voici les résultats obtenus avec le code écrit ci-dessus. Vous pouvez voir que le bouton conserve son format d’image 5: 1 sur différents appareils:
Swift 3:
yourView.addConstraint(NSLayoutConstraint(item: yourView,
attribute: .height,
relatedBy: .equal,
toItem: yourView,
attribute: .width,
multiplier: 9.0 / 16.0,
constant: 0))
Vous pouvez définir "Contrainte de hauteur" au moment de la conception dans Interface Builder. Il suffit de cocher '' Supprimer au moment de la construction '', et l'application disparaîtra au moment de l'exécution.
Après cela, vous pouvez ajouter une contrainte "Aspect Ratio", par exemple, dans la méthode viewDidLoad.
Dans Xamain.iOS pour "16: 9", il ressemble à ceci:
this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create(
this.ImageOfTheDay,
NSLayoutAttribute.Height,
NSLayoutRelation.Equal,
this.ImageOfTheDay,
NSLayoutAttribute.Width,
9.0f / 16.0f,
0));
Ou, comme Mahesh Agrawal a dit:
[self.ImageOfTheDay addConstraint:[NSLayoutConstraint
constraintWithItem:self.ImageOfTheDay
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.ImageOfTheDay
attribute:NSLayoutAttributeWidth
multiplier:(9.0f / 16.0f)
constant:0]];
J'ai essayé toutes les réponses ci-dessus mais cela n'a pas fonctionné, et voici ma solution avec 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()
Extension d'assistance sur UIView
extension UIView {
func aspectRation(_ ratio: CGFloat) -> NSLayoutConstraint {
return NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: self, attribute: .width, multiplier: ratio, constant: 0)
}
}
Et l'utilisation est:
view.aspectRation(1.0/1.0).isActive = true