选择 stackView 上的哪个子视图将拉伸(以编程方式)

Posted

技术标签:

【中文标题】选择 stackView 上的哪个子视图将拉伸(以编程方式)【英文标题】:Choose which subview on a stackView will stretch (Programmatically) 【发布时间】:2019-01-21 17:16:33 【问题描述】:

我有一个水平堆栈视图的显示,其中子视图由标签和文本字段组成。 stackView 受视图边框的限制

我正在尝试将我的 textField 子视图拉伸到填充堆栈的剩余空间,而标签的堆栈会调整以适应标签大小本身。但相反的情况正在发生。我尝试了很多解决方案,但没有任何帮助。我们以编程方式制作的所有视图和约束。

对于我的堆栈,我正在使用:

func customTextField() -> UIStackView 

    let stack: UIStackView = 
        let sv = UIStackView()
        sv.axis = .horizontal
        sv.isLayoutMarginsRelativeArrangement = true
        sv.alignment = .leading
        sv.backgroundColor = .red
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    ()


    let label: UILabel = 
        let lb = UILabel()
        lb.backgroundColor = .red
        lb.text = "Label is here"
        lb.translatesAutoresizingMaskIntoConstraints = false
        return lb
    ()

    let textField: UITextField = 
        let tf = UITextField()
        tf.backgroundColor = .blue
        tf.text = "Text Field"
        tf.translatesAutoresizingMaskIntoConstraints = false
        return tf
    ()


    stack.addArrangedSubview(label)
    stack.addArrangedSubview(textField)
    return stack

我的 customTextField 的调用者:

    let profileUserStack: UIStackView = 
        let stack = UIStackView()
        stack.axis = .vertical
        stack.spacing = 8
        stack.contentMode = .scaleToFill
        stack.translatesAutoresizingMaskIntoConstraints = false
        return stack
    ()
    self.addSubview(profileUserStack)

    for i in profileTextViews 
        let view = self.customTextField()
        profileUserStack.addArrangedSubview(view)
    

    constraints.append(profileUserStack.buildConstraint(toItem: perfilImageView, constant: 32, type: .top, baseItem: .bottom))

    constraints.append(profileUserStack.buildConstraint(toItem: self, constant: 16, type: .leading, baseItem: .leading))

    constraints.append(profileUserStack.buildConstraint(toItem: self, constant: -16, type: .trailing, baseItem: .trailing))

    activateConstraints(&constraints, to: self)

结果: https://imgur.com/a/ccFZlRM

请注意,这正是我想要实现的目标。但我希望 textField 被拉伸。

【问题讨论】:

【参考方案1】:

contentHuggingPriority 设置为label,使其始终保持其内容的大小,而textField 占用剩余空间。

label.setContentHuggingPriority(.defaultHigh, for: .horizontal)

【讨论】:

按我的需要工作!谢谢!

以上是关于选择 stackView 上的哪个子视图将拉伸(以编程方式)的主要内容,如果未能解决你的问题,请参考以下文章

水平 UIStackView 拉伸子视图

隐藏stackview中的第一个子视图和其他在iOS 10.2上消失但不是11

在 Swift 中以编程方式将视图添加到 stackview

如何解决 Interface Builder Xcode 中的 stackview 错误问题?

如何向 StackView 的子视图内的视图添加约束

将视图添加到将拉伸以填充可用宽度的滚动视图