如何修复不中心的堆栈视图?
在这里,我有一个带有三个子视图的水平堆栈视图,但是,它看起来有些不利,如下所示。
我试图:
- 将堆栈视图的CenterXanchor限制为等于Supperiew的Centriew的CenterXanchor
- 设置了堆栈视图的对齐方式,以中心
如何正确地将我的堆栈视图正确对齐到Supperiew的中心?
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(macroStackView)
macroStackView.translatesAutoresizingMaskIntoConstraints = false
constrainView()
}
lazy var carbView: UIView = {
var view = UIView()
var iv = UIImageView(image: Image.planViewBg)
iv.frame = CGRect(x: 0, y: 0, width: 105, height: 118)
iv.contentMode = .scaleAspectFit
var label1 = UILabel()
label1.text = "31%"
label1.textAlignment = .center
var label2 = UILabel()
label2.text = "30g"
label2.textAlignment = .center
var label3 = UILabel()
label3.text = "Carbs"
label3.textAlignment = .center
var labelStack = UIStackView(arrangedSubviews: [label1, label2, label3])
labelStack.axis = .vertical
labelStack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(iv)
iv.addSubview(labelStack)
NSLayoutConstraint.activate([
labelStack.centerXAnchor.constraint(equalTo: iv.centerXAnchor),
labelStack.centerYAnchor.constraint(equalTo: iv.centerYAnchor),
])
return view
}()
lazy var proteinView: UIView = {
var view = UIView()
var iv = UIImageView(image: Image.planViewBg)
iv.frame = CGRect(x: 0, y: 0, width: 105, height: 118)
iv.contentMode = .scaleAspectFit
var label1 = UILabel()
label1.text = "23%"
label1.textAlignment = .center
var label2 = UILabel()
label2.text = "23g"
label2.textAlignment = .center
var label3 = UILabel()
label3.text = "Protein"
label3.textAlignment = .center
var labelStack = UIStackView(arrangedSubviews: [label1, label2, label3])
labelStack.axis = .vertical
labelStack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(iv)
iv.addSubview(labelStack)
NSLayoutConstraint.activate([
labelStack.centerXAnchor.constraint(equalTo: iv.centerXAnchor),
labelStack.centerYAnchor.constraint(equalTo: iv.centerYAnchor),
])
return view
}()
lazy var fatView: UIView = {
var view = UIView()
var iv = UIImageView(image: Image.planViewBg)
iv.frame = CGRect(x: 0, y: 0, width: 105, height: 118)
iv.contentMode = .scaleAspectFit
var label1 = UILabel()
label1.text = "46%"
label1.textAlignment = .center
var label2 = UILabel()
label2.text = "20g"
label2.textAlignment = .center
var label3 = UILabel()
label3.text = "Fat"
label3.textAlignment = .center
var labelStack = UIStackView(arrangedSubviews: [label1, label2, label3])
labelStack.axis = .vertical
labelStack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(iv)
iv.addSubview(labelStack)
NSLayoutConstraint.activate([
labelStack.centerXAnchor.constraint(equalTo: iv.centerXAnchor),
labelStack.centerYAnchor.constraint(equalTo: iv.centerYAnchor),
])
return view
}()
lazy var macroStackView: UIStackView = {
var stack = UIStackView(arrangedSubviews: [carbView, proteinView, fatView])
stack.axis = .horizontal
stack.distribution = .fillEqually
stack.alignment = .center
return stack
}()
func constrainView() {
NSLayoutConstraint.activate([
macroStackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
macroStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 30),
macroStackView.widthAnchor.constraint(equalTo: view.widthAnchor,
multiplier: 0.9)
])
}
}
Here I have a horizontal stack view with three subviews, however, it looks to be a bit off-centered as shown below.
I tried to:
- Constrain the stack view's centerXAnchor to be equal to the superview's centerXAnchor
- Set the stack view's alignment to center
How can I correctly align my stack view to the center of the superview?
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(macroStackView)
macroStackView.translatesAutoresizingMaskIntoConstraints = false
constrainView()
}
lazy var carbView: UIView = {
var view = UIView()
var iv = UIImageView(image: Image.planViewBg)
iv.frame = CGRect(x: 0, y: 0, width: 105, height: 118)
iv.contentMode = .scaleAspectFit
var label1 = UILabel()
label1.text = "31%"
label1.textAlignment = .center
var label2 = UILabel()
label2.text = "30g"
label2.textAlignment = .center
var label3 = UILabel()
label3.text = "Carbs"
label3.textAlignment = .center
var labelStack = UIStackView(arrangedSubviews: [label1, label2, label3])
labelStack.axis = .vertical
labelStack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(iv)
iv.addSubview(labelStack)
NSLayoutConstraint.activate([
labelStack.centerXAnchor.constraint(equalTo: iv.centerXAnchor),
labelStack.centerYAnchor.constraint(equalTo: iv.centerYAnchor),
])
return view
}()
lazy var proteinView: UIView = {
var view = UIView()
var iv = UIImageView(image: Image.planViewBg)
iv.frame = CGRect(x: 0, y: 0, width: 105, height: 118)
iv.contentMode = .scaleAspectFit
var label1 = UILabel()
label1.text = "23%"
label1.textAlignment = .center
var label2 = UILabel()
label2.text = "23g"
label2.textAlignment = .center
var label3 = UILabel()
label3.text = "Protein"
label3.textAlignment = .center
var labelStack = UIStackView(arrangedSubviews: [label1, label2, label3])
labelStack.axis = .vertical
labelStack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(iv)
iv.addSubview(labelStack)
NSLayoutConstraint.activate([
labelStack.centerXAnchor.constraint(equalTo: iv.centerXAnchor),
labelStack.centerYAnchor.constraint(equalTo: iv.centerYAnchor),
])
return view
}()
lazy var fatView: UIView = {
var view = UIView()
var iv = UIImageView(image: Image.planViewBg)
iv.frame = CGRect(x: 0, y: 0, width: 105, height: 118)
iv.contentMode = .scaleAspectFit
var label1 = UILabel()
label1.text = "46%"
label1.textAlignment = .center
var label2 = UILabel()
label2.text = "20g"
label2.textAlignment = .center
var label3 = UILabel()
label3.text = "Fat"
label3.textAlignment = .center
var labelStack = UIStackView(arrangedSubviews: [label1, label2, label3])
labelStack.axis = .vertical
labelStack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(iv)
iv.addSubview(labelStack)
NSLayoutConstraint.activate([
labelStack.centerXAnchor.constraint(equalTo: iv.centerXAnchor),
labelStack.centerYAnchor.constraint(equalTo: iv.centerYAnchor),
])
return view
}()
lazy var macroStackView: UIStackView = {
var stack = UIStackView(arrangedSubviews: [carbView, proteinView, fatView])
stack.axis = .horizontal
stack.distribution = .fillEqually
stack.alignment = .center
return stack
}()
func constrainView() {
NSLayoutConstraint.activate([
macroStackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
macroStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 30),
macroStackView.widthAnchor.constraint(equalTo: view.widthAnchor,
multiplier: 0.9)
])
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
iv
s没有其translatesAutoresizingMaskIntoconstraints
设置为false。这使其位置固定在View
s中的(0,0)。视图
s被堆栈视图正确拉伸,这就是为什么(0、0、105、118)帧在右侧留出很多空白的原因。堆栈视图的比对描述了如何分布到轴上的垂直。在这种情况下,轴是水平的,因此
对齐
是关于沿堆栈视图高度对齐的内容,而不是您可能假定的宽度。似乎您想要.fill
在这里 - “框”应填充堆栈视图的高度。无论如何,一个简单的解决方案是通过添加约束来正确定位
iv
s在View
s中。首先设置
您应该在要添加约束时 。然后添加以下约束:
我也看不到任何确定
macrostackView
的高度。您应该将高度约束添加到macrostackView
。另外,您可以从
view
中取消安装iv
,并且只有直接返回IV
。在这种情况下,您需要设置堆栈视图的
间距
以实现所需的间距。Tthe
iv
s do not have itstranslatesAutoresizingMaskIntoConstraints
set to false. This makes its position fixed at (0, 0) within theview
s. Theview
s are properly stretched by the stack view however, which is why a frame of (0, 0, 105, 118) leaves a lot of blank space on the right.The alignment of a stack view describes how things are distributed perpendicular to the axis. In this case, the axis is horizontal, so
alignment
is about how things align along the height of the stack view, not the width as you may have assumed. It seems like you want.fill
here - the "boxes" should fill the height of the stack view.In any case, a simple solution is to position the
iv
s correctly within theview
s by adding constraints.You should first set
as you are about to add constraints. Then add these constraints:
I also don't see anything that determines the height of
macroStackView
. You should add a height constraint tomacroStackView
.Alternatively, you could un-embed
iv
from theview
, and justreturn iv
directly.In this case, you would need to set the
spacing
of the stack view to achieve the spacing that you want.