在 UIStackView 中垂直居中三个 UILabel

Posted

技术标签:

【中文标题】在 UIStackView 中垂直居中三个 UILabel【英文标题】:Center Vertically Three UILabels inside UIStackView 【发布时间】:2018-12-05 12:07:00 【问题描述】:

我在一个UIStackView 中有三个UILabels。其中一个有多行(最后一个),其他只有一行。我希望它们在UIStackView 内居中,以便顶部和底部空间可以是动态的。我究竟做错了什么?

headingLabel.translatesAutoresizingMaskIntoConstraints = false
headingLabel.textAlignment = .center
subHeadingLabel.translatesAutoresizingMaskIntoConstraints = false
subHeadingLabel.textAlignment = .center
subHeadingLabel.numberOfLines = 0
bodyLabel.translatesAutoresizingMaskIntoConstraints = false
bodyLabel.textAlignment = .center
bodyLabel.numberOfLines = 0
bodyLabel.text = "My very very long text \n to make it multiline"
textStackView.axis = .vertical
textStackView.distribution = .fillProportionally
textStackView.alignment = .center
textStackView.translatesAutoresizingMaskIntoConstraints = false

textStackView.addArrangedSubview(headingLabel)
textStackView.addArrangedSubview(subHeadingLabel)
textStackView.addArrangedSubview(bodyLabel)

现在的样子:

应该如何:

编辑:我也尝试使用 fillEqually,但它不会改变任何东西。我还设置了 UIStackView 的顶部和底部锚点。我想在这里实现的是,例如 UIStackView 的高度为 100,所有三个标签的高度均为 40。这 60 个以上的空间应该平均分布,如上下 30-30。

UIStackView 的约束

myStackView.anchor(contentImageView.bottomAnchor, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 0)

一种解决方案: 我通过将 UIStackView 放在 UIView 中来解决它,并且不给 UIStackView 高度。只需居中 X 和 Y 锚点。它解决了我的问题,但我不确定它是否是一个正确的解决方案。

【问题讨论】:

你是如何通过代码或在 XIB 中设置 UIStackView 的? 按代码。我编辑了我的问题。 【参考方案1】:

确保UIStackView 底部约束在UIViewController 的视图中应大于等于零。这样,UIStackView 的高度就会根据里面的内容增加。

试试这个。

let myStackView = UIStackView()
view.addSubview(myStackView)
myStackView.translatesAutoresizingMaskIntoConstraints = false
myStackView.topAnchor.constraint(greaterThanOrEqualTo: view.topAnchor, constant: 0.0).isActive = true
myStackView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0.0).isActive = true
myStackView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0.0).isActive = true
myStackView.bottomAnchor.constraint(greaterThanOrEqualTo: view.bottomAnchor, constant: 0.0).isActive = true
myStackView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0).isActive = true
myStackView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0.0).isActive = true

【讨论】:

【参考方案2】:

我想在这里实现的是,例如 UIStackView 的高度为 100,所有三个标签的高度均为 40。这 60 个以上的空间应该像上下 30-30 一样平均分布。

堆栈视图不是这样工作的。如果你想要三个高度为 40 的标签,那么就这样做,不需要堆栈视图。或者将堆栈视图高度设置为 40 并将其居中。

【讨论】:

以上是关于在 UIStackView 中垂直居中三个 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

带有 UISegmentedControl 的 UIStackView

UIStackView 对齐问题

HTML中div块水平垂直居中的三个方法

如何使 UITableView 在 UIStackView 内以 X 和 Y 为中心

UIStackView 没有将自身对齐到中心?对象-c

Swift:如何在垂直stackview中水平居中元素