首页 > 解决方案 > 选择 stackView 上的哪个子视图将拉伸(以编程方式)

问题描述

我有一个水平堆栈视图的显示,其中子视图包含在标签和文本字段上。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 被拉伸。

标签: iosswiftuistackview

解决方案


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

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

推荐阅读