2017-05-10 2 views
2

J'essaye d'ajouter deux dynamiques UILabels à un UIStackLabel. L'objectif est de centrer les deux étiquettes horizontalement au milieu de la vue.Ajouter par programme des vues à un UIStackView

Les deux UILabels sont:

var nameLabel: UILabel! 
var ageLabel: UILabel! 

Et le UIStackView est:

var stackedInfoView: UIStackView! 

J'ai essayé de suivre les directives fournies dans ce answer, configuration mon point de vue en tant que tel:

nameLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 120.0, height: 24.0)) 
ageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 80.0, height: 24.0)) 
nameLabel.text = "Harry Potter" 
ageLabel.text = "100" 


stackedInfoView = UIStackView(arrangedSubviews: [nameLabel, ageLabel]) 
stackedInfoView.axis = .horizontal 
stackedInfoView.distribution = .equalSpacing 
stackedInfoView.alignment = .center 
stackedInfoView.spacing = 30.0 
stackedInfoView.centerXAnchor.constraint(equalTo: self.extendedNavView.centerXAnchor).isActive = true 
stackedInfoView.centerYAnchor.constraint(equalTo: self.extendedNavView.centerYAnchor).isActive = true 

self.extendedNavView.addSubview(stackedInfoView) //extendedNavView is configured inside Storyboard 

Mon problème est que, stackedInfoView ne s'affichera pas. En outre, lorsque j'imprime frame, j'obtiens {{0, 0}, {0, 0}}. Je reçois également un tas de messages d'erreur à propos de Unable to simultaneously satisfy constraints.

Qu'est-ce que je fais de façon incorrecte en faisant mon UIStackView? Toute orientation est très appréciée.

Répondre

2

Deux problèmes,

devraient être mis après self.extendedNavView.addSubview(stackedInfoView). Parce que la vue de pile doit être dans la hiérarchie de vue avant de configurer les contraintes.

Ensuite, ajoutez stackedInfoView.translatesAutoresizingMaskIntoConstraints = false pour indiquer à UIKit que vous souhaitez utiliser la mise en page automatique pour définir la position de la vue de la pile.

Le code suivant devrait fonctionner si extendedNavView n'a pas de problème de mise en page dans le story-board:

override func viewDidLoad() { 
    super.viewDidLoad() 

    var nameLabel: UILabel! 
    var ageLabel: UILabel! 

    var stackedInfoView: UIStackView! 

    nameLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 120.0, height: 24.0)) 
    ageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 80.0, height: 24.0)) 
    nameLabel.text = "Harry Potter" 
    ageLabel.text = "100" 

    stackedInfoView = UIStackView(arrangedSubviews: [nameLabel, ageLabel]) 
    stackedInfoView.axis = .horizontal 
    stackedInfoView.distribution = .equalSpacing 
    stackedInfoView.alignment = .center 
    stackedInfoView.spacing = 30.0 

    stackedInfoView.translatesAutoresizingMaskIntoConstraints = false 

    self.extendedNavView.addSubview(stackedInfoView) //extendedNavView is configured inside Storyboard 

    stackedInfoView.centerXAnchor.constraint(equalTo: self.extendedNavView.centerXAnchor).isActive = true 
    stackedInfoView.centerYAnchor.constraint(equalTo: self.extendedNavView.centerYAnchor).isActive = true 

} 
+0

Merci! Cela a beaucoup aidé – daspianist