web-dev-qa-db-fra.com

Ajouter une sous-vue et la positionner avec des contraintes par programme

J'ai ajouté un UIView en utilisant l'IB sur le contrôleur de vue. Appelons cela le redView.

enter image description here

Ensuite, j'ai épinglé ses quatre côtés en utilisant des contraintes de mise en page automatique dans le code et lorsque je l'exécute, cela ressemble à cela comme prévu.

enter image description here

Maintenant, je veux ajouter un UILabel à cette vue par programme et le positionner au centre en utilisant des contraintes de disposition automatique.

Voici le code que j'ai jusqu'à présent.

import UIKit

class ViewController: UIViewController {

    @IBOutlet private var redView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        redView.setTranslatesAutoresizingMaskIntoConstraints(false)

        let leadingConstraint = NSLayoutConstraint(item: redView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1, constant: 0)
        let trailingConstraint = NSLayoutConstraint(item: redView, attribute: .Trailing, relatedBy: .Equal, toItem: view, attribute: .Trailing, multiplier: 1, constant: 0)
        let topConstraint = NSLayoutConstraint(item: redView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 0)
        let bottomConstraint = NSLayoutConstraint(item: redView, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1, constant: 0)
        view.addConstraints([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])


        let label = UILabel()
        label.text = "Auto Layout Exercise"
        redView.addSubview(label)

        let xCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: redView, attribute: .CenterX, multiplier: 1, constant: 0)
        let yCenterConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: redView, attribute: .CenterY, multiplier: 1, constant: 0)
        let leadingConstraint1 = NSLayoutConstraint(item: label, attribute: .Leading, relatedBy: .Equal, toItem: redView, attribute: .Leading, multiplier: 1, constant: 20)
        let trailingConstraint1 = NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: redView, attribute: .Trailing, multiplier: 1, constant: -20)
        redView.addConstraints([xCenterConstraint, yCenterConstraint, leadingConstraint1, trailingConstraint1])

    }

}

Le problème est que l'étiquette n'apparaît pas sur le redView. Quelqu'un peut-il me dire ce qui me manque ici?

Je vous remercie.

18
Isuru

Je suis sûr que vous devez également définir:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

Sinon, je ne pense pas que les contraintes s'appliqueront à l'étiquette.

37
Glynbeard

Remarque pour Swift 2/3

Elle a changé en propriété booléenne: IView.translatesAutoresizingMaskIntoConstraints

Au lieu d'être auparavant:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

C'est maintenant:

label.translatesAutoresizingMaskIntoConstraints = false
13
Nikita Kurtin

Vous devez le faire pour chaque UIControl pour assigner NSConstraints

label.translatesAutoresizingMaskIntoConstraints = false
3
jaiswal Rajan