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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将layoutMargins添加到UIStackView中的一个元素相关的知识,希望对你有一定的参考价值。

我想创建一个包含3个元素的垂直堆栈视图。我想在第二个和最后一个元素之间留出更多的空间。所以我想添加到最后一个元素:

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)
//...
答案

同样,您可以将视图的顶部(或底部)锚点相对于其嵌入的任何视图的相应边缘进行约束。什么是丑陋的有点味道,我发现自动布局限制易于使用和易于推理。

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)。看来你必须约束高度和宽度,当你添加arrangeSubview时,StackView会为你限制左/上/右/下位置。

我的第二个观点是一个标签:我希望在文本下留40个边距。所以我首先将标签高度计算到其.frame属性中,并在frame.height + 40(=我的边距)处约束高度。

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

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

另一答案

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

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

以上是关于将layoutMargins添加到UIStackView中的一个元素的主要内容,如果未能解决你的问题,请参考以下文章

imageView.layoutMargins = UIEdgeInsets.zero 在 UICollectionViewCell 中没有效果

如何通过stackview将图像添加到tableview单元格

如何以编程方式将 UIImageView 添加到 UIStackView(故事板)

使用自动布局设置 layoutMargins

从 UIStackView 中缺少的代码添加的 UITextView

iOS 8和layoutMargin中的自定义UITableViewCells