web-dev-qa-db-fra.com

Comment définir des contraintes de format d'image par programme dans iOS?

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?

52
IRD

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))
69
Mahesh Agrawal

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:

Result view

48
Eugene Brusov

Swift 3:

yourView.addConstraint(NSLayoutConstraint(item: yourView,
                                          attribute: .height,
                                          relatedBy: .equal,
                                          toItem: yourView,
                                          attribute: .width,
                                          multiplier: 9.0 / 16.0,
                                          constant: 0))
13
RNHTTR

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.

enter image description here 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]];
11
Zanael

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()
3
tuandapen

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

2
Michał Ziobro