web-dev-qa-db-fra.com

Swift 3 Créez UILabel par programme et ajoutez NSLayoutConstraints

Bonjour, j'essaie de créer une étiquette par programme et d'ajouter NSLayoutConstraints afin qu'elle soit centrée dans la vue d'ensemble indépendamment de la taille et de l'orientation de l'écran, etc. J'ai regardé mais je ne trouve tout simplement pas d'exemple à suivre. Voici ce que j'ai:

let codedLabel:UILabel = UILabel()
codedLabel.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
codedLabel.textAlignment = .center
codedLabel.text = alertText
codedLabel.numberOfLines=1
codedLabel.textColor=UIColor.red
codedLabel.font=UIFont.systemFont(ofSize: 22)
codedLabel.backgroundColor=UIColor.lightGray

let heightConstraint:NSLayoutConstraint = NSLayoutConstraint(item: codedLabel, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 200)

let widthConstraint:NSLayoutConstraint = NSLayoutConstraint(item: codedLabel, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 200)

codedLabel.addConstraints([heightConstraint, widthConstraint])

let verticalConstraint:NSLayoutConstraint = NSLayoutConstraint(item: codedLabel, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: self.contentView, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 0)

let horizontalConstraint:NSLayoutConstraint = NSLayoutConstraint(item: codedLabel, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: self.contentView, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0)

self.contentView.addConstraints([verticalConstraint, horizontalConstraint])

self.contentView.addSubview(codedLabel)
9
iGeorge

Voir le code ci-dessous comme exemple

let lblNew = UILabel()
lblNew.backgroundColor = UIColor.blue
lblNew.text = "Test"
lblNew.textColor = UIColor.white
lblNew.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(lblNew)

let widthConstraint = NSLayoutConstraint(item: lblNew, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 300)
let heightConstraint = NSLayoutConstraint(item: lblNew, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 200)
var constraints = NSLayoutConstraint.constraints(
    withVisualFormat: "V:[superview]-(<=1)-[label]",
    options: NSLayoutFormatOptions.alignAllCenterX,
    metrics: nil,
    views: ["superview":view, "label":lblNew])

view.addConstraints(constraints)

// Center vertically
constraints = NSLayoutConstraint.constraints(
    withVisualFormat: "H:[superview]-(<=1)-[label]",
    options: NSLayoutFormatOptions.alignAllCenterY,
    metrics: nil,
    views: ["superview":view, "label":lblNew])

view.addConstraints(constraints)

view.addConstraints([ widthConstraint, heightConstraint])
11
Rajat

NSLayoutAnchor était nouveau dans iOS 9 et il nettoie considérablement la syntaxe des contraintes.

let codedLabel:UILabel = UILabel()
codedLabel.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
codedLabel.textAlignment = .center
codedLabel.text = alertText
codedLabel.numberOfLines=1
codedLabel.textColor=UIColor.red
codedLabel.font=UIFont.systemFont(ofSize: 22)
codedLabel.backgroundColor=UIColor.lightGray

self.contentView.addSubview(codedLabel)
codedLabel.translatesAutoresizingMaskIntoConstraints = false
codedLabel.heightAnchor.constraint(equalToConstant: 200).isActive = true
codedLabel.widthAnchor.constraint(equalToConstant: 200).isActive = true
codedLabel.centerXAnchor.constraint(equalTo: codedLabel.superview!.centerXAnchor).isActive = true
codedLabel.centerYAnchor.constraint(equalTo: codedLabel.superview!.centerYAnchor).isActive = true
23
Josh Homann
let myLabel: UILabel = {
  let lb = UILabel()
  lb.translatesAutoresizingMaskIntoConstraints = false
  lb.textAlignment = .center
  lb.numberOfLines = 1
  lb.textColor = UIColor.black
  lb.font=UIFont.systemFont(ofSize: 22)
  lb.backgroundColor = UIColor.grey
  return lb
}()

Dans la méthode super.viewDidLoad(), vous devez ajouter une étiquette à votre vue et ajouter des contraintes pour l'étiquette:

override func viewDidLoad() {
  super.viewDidLoad()
  self.view.addSubView(myLabel)
  setUpMyLabel()
}

func setUpMyLabel() {
  NSLayoutConstraint.activate([
            myLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            myLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            myLabel.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.7),
            myLabel.heightAnchor.constraint(equalToConstant: 50)])
}

J'espère que mon code peut vous aider.

4
Huy Nguyen