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

Choose which subview on a stackView will stretch (Programmatically)

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

我正在尝试拉伸我的 textField 子视图,使其填充剩余的 space 堆栈,同时调整标签的堆栈以适应标签本身的大小。但相反的情况正在发生。我尝试了很多解决方案,但没有任何帮助。我们以编程方式进行的所有视图和约束。

对于我的堆栈,我使用的是:

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
}

我的自定义文本字段的调用者:

    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 被拉伸。

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

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