我想创建一个包含 3 个元素的垂直堆栈视图。我只希望在第二个和最后一个元素之间有更多的空间。所以我考虑添加到最后一个元素:
mylastelement.layoutMargins = UIEdgeInsets(top:30, left:0,bottom:0, right:0)
但是布局边距没有在我的堆栈视图中应用。有没有简单的方法可以实现这一点(Id 喜欢避免修改最后一个元素的内部高度(。
编辑:我只是尝试通过执行以下操作在其框架内增加第二个元素高度(+50(:
my2ndElementLabel.sizeToFit()
my2ndElementLabel.frame = CGRect(x:my2ndElementLabel.frame.origin.x,y:lmy2ndElementLabel.frame.origin.y,
width:my2ndElementLabel.frame.width, height:my2ndElementLabel.frame.height + 50)
但它没有效果。
编辑2 : 我试图在我的UIStackView中添加一个随机视图,但该视图被忽略了!在理解UIKit如何工作时可能遗漏了一些东西?...:
let v = UIView(frame:CGRect(x:0,y:0,width:100,height:400))
v.backgroundColor = .red
myStackView.addArrangedSubview(v)
//...
这是我所做的一个扩展,有助于实现快速的此类利润:
extension UIStackView {
func addArrangedSubview(_ v:UIView, withMargin m:UIEdgeInsets )
{
let containerForMargin = UIView()
containerForMargin.addSubview(v)
v.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
v.topAnchor.constraint(equalTo: containerForMargin.topAnchor, constant:m.top ),
v.bottomAnchor.constraint(equalTo: containerForMargin.bottomAnchor, constant: m.bottom ),
v.leftAnchor.constraint(equalTo: containerForMargin.leftAnchor, constant: m.left),
v.rightAnchor.constraint(equalTo: containerForMargin.rightAnchor, constant: m.right)
])
addArrangedSubview(containerForMargin)
}
}
您可以做的是在第二个和第三个元素之间设置自定义间距。
myStackView.setCustomSpacing(30.0, after: my2ndElementLabel)
在相同的一般情况下,您可以相对于嵌入视图的任何视图的相应边缘来约束视图的顶部(或底部(锚点。丑陋的东西有点品味问题,我发现自动布局约束易于使用且易于推理。
来自Mac OS而不是iOS的简单示例:
let button = ControlFactory.labeledButton("Filter")
addSubview(button)
button.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20).isActive = true
button.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
此特定代码位于视图初始值设定项中,并将一个按钮放置在视图中间,从底部向上 20 点。
我发现自己:看起来UIStackView根本不适用于旧的尺寸系统(带有.frame(。似乎您必须约束高度和宽度,当您添加排列的子视图时,StackView 将为您约束左/上/右/底部位置。
我的第二个观点是一个标签:我想要文本下方的 40 边距。所以我首先将标签高度计算到它的 .frame 属性中,并在 frame.height + 40(= 我的边距(处约束高度
labelDesc.sizeToFit()
labelDesc.heightAnchor.constraint(equalToConstant:40).isActive = true
不过,我发现自己的解决方案非常丑陋。我相信UIKit提供了一种更好的方法来实现这样一个简单的目标,而不必制作这些DIY解决方案。因此,如果您习惯使用UIKit,请告诉我是否有更好的解决方案。
通过在堆栈视图中插入正确大小的 UIView 来添加"边距"。
如果您需要 40px 的 2 个特定元素之间的边距......添加高度约束为 40px 的 UIView。指定clearColor
背景以使其不可见。
您可以将 IBOutlet 添加到此视图中,并像在堆栈视图中隐藏任何其他项目一样隐藏它。