以编程方式将视图添加到UIStackView

das*_*ist 3 ios autolayout swift uistackview

我试图添加两个动态UILabels到一个UIStackLabel.目标是将两个标签水平放置在视图中间.

这两个UILabels是:

var nameLabel: UILabel!
var ageLabel: UILabel!
Run Code Online (Sandbox Code Playgroud)

而且UIStackView是:

var stackedInfoView: UIStackView!
Run Code Online (Sandbox Code Playgroud)

我试图遵循本回答中提供的指导原则,配置我的观点:

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
Run Code Online (Sandbox Code Playgroud)

我的问题是,stackedInfoView不会出现.此外,当我打印它frame,我得到{{0, 0}, {0, 0}}.我也收到一堆关于的错误消息Unable to simultaneously satisfy constraints.

我做错了UIStackView什么?任何指导都非常感谢.

Cos*_*syn 6

两个问题,

stackedInfoView.centerXAnchor.constraint(equalTo:self.extendedNavView.centerXAnchor).isActive = true
stackedInfoView.centerYAnchor.constraint(equalTo:self.extendedNavView.centerYAnchor).isActive = true
Run Code Online (Sandbox Code Playgroud)

应该放在后面self.extendedNavView.addSubview(stackedInfoView).因为在配置约束之前,堆栈视图必须位于视图层次结构中.

其次,添加stackedInfoView.translatesAutoresizingMaskIntoConstraints = false告诉UIKit您要使用自动布局来设置堆栈视图的位置.

如果extendedNavView故事板中没有布局问题,则以下代码应该有效:

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

}
Run Code Online (Sandbox Code Playgroud)