将layoutMargins添加到UIStackView中的一个元素

时间:2019-03-31 13:17:57

标签: swift uistackview layoutmargins

我想创建一个包含3个元素的垂直stackview。 我只想在第二个元素和最后一个元素之间留一点空间。所以我考虑添加到最后一个元素:

mylastelement.layoutMargins = UIEdgeInsets(top:30, left:0,bottom:0, right:0)

但是layoutmargins没有应用到我的stackview中。有什么简单的方法可以实现(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)

但是没有效果。

EDIT2:我试图向我的UIStackView添加一个随机视图,但是该视图只是被忽略了!可能错过了一些了解UIKit的工作原理的东西?...:

let v = UIView(frame:CGRect(x:0,y:0,width:100,height:400))
v.backgroundColor = .red
myStackView.addArrangedSubview(v)
//...

4 个答案:

答案 0 :(得分:1)

以相同的方式,可以相对于嵌入视图的任何视图的相对边缘来约束视图的顶部(或底部)锚点。有点丑陋的是,我发现自动布局约束易于使用且易于推理。

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点。

答案 1 :(得分:0)

我发现自己:看来UIStackView在旧的大小调整系统(.frame)下根本不起作用。似乎您必须限制高度和宽度,并且在添加rangedSubview时,StackView将为您限制左/上/右/下位置。

我的第二个观点是一个标签:我希望文本下的空白为40。因此,我首先将标签的高度计算为其.frame属性,并将其高度限制为frame.height + 40(=我的余量)

labelDesc.sizeToFit()
labelDesc.heightAnchor.constraint(equalToConstant:40).isActive = true

我发现自己的解决方案非常丑陋。我确信UIKit提供了一种更好的方法来实现这样一个简单的目标,而无需制作此类DIY解决方案。因此,如果您习惯使用UIKit,请告诉我是否有更好的解决方案。

答案 2 :(得分:0)

这是我所做的扩展,有助于快速实现这样的利润:

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)
    }
}

答案 3 :(得分:0)

考虑根据需要通过在堆栈视图中插入正确大小的UIView来添加“边距”。

如果您需要在2个特定元素之间留出40px的空白,请添加一个高度限制为40px的UIView。分配一个clearColor背景以使其不可见。

您可以将IBOutlets添加到此视图,并像在堆栈视图中的其他任何项一样将其隐藏。