首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在UIStackView中自动配置组件(编程)

在UIStackView中自动配置组件(编程)
EN

Stack Overflow用户
提问于 2021-07-12 01:11:09
回答 2查看 156关注 0票数 0

嗨。正如您所看到的,组件在UIStackView中是重叠的,而我正为此而苦苦挣扎。

下面是一些代码片段

代码语言:javascript
运行
复制
class BottomSheetController: UIViewController {
    lazy var headerLabel: UILabel = {
        let label = UILabel()
        label.text = "Workout"

        return label
    }()

    lazy var header: UIView = {
        let uiView = UIView()
        return uiView
    }()

    lazy var workoutInput: UITextField = {
        let textField = UITextField()

        textField.placeholder = "Find or add option"
        textField.sizeToFit()
        textField.clipsToBounds = true
        textField.backgroundColor = UIColor(red: 65 / 255.0, green: 65 / 255.0, blue: 65 / 255.0, alpha: 0.4)
        textField.layer.cornerRadius = 5

        textField.setImage(image: UIImage(named: "search_black")!)
        textField.setClearTextButton()

        return textField
    }()

    lazy var tagsView: UIScrollView = {
       let scrollView = UIScrollView()
        scrollView.backgroundColor = .red
        return scrollView
    }()

    lazy var containerStackView: UIStackView = {
        let stackView = UIStackView(arrangedSubviews: [header, workoutInput, tagsView])

        stackView.clipsToBounds = true
        stackView.axis = .vertical
        stackView.backgroundColor = .systemGray2

        return stackView
    }()

// ...

 private func setConstraint() {
    header.addSubview(headerLabel)
        header.addSubview(doneButton)


     containerStackView.snp.makeConstraints { make in
            make.top.left.right.bottom.equalToSuperview().inset(20)
        }
        headerLabel.snp.makeConstraints { make in
            make.top.centerX.equalToSuperview()
        }
        doneButton.snp.makeConstraints { make in
            make.top.right.equalToSuperview()
        }
        workoutInput.snp.makeConstraints {make in
            make.height.equalTo(40)
        }
  }
}

我的问题可能是,header视图没有固定的高度值

但我不想将神奇的数字设置为header视图。而是分配与子视图(workoutInput)对应的值。

overlapping?:

  1. 是否有调整高度的奇特方法?
  2. 如何防止组件从
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-12 14:39:23

您需要添加足够的约束来满足自动布局要求。

UIView没有内在的大小..。所以你的header以零的高度结束。

进行一些更改以控制该视图的高度:

代码语言:javascript
运行
复制
private func setConstraint() {
    header.addSubview(headerLabel)
    header.addSubview(doneButton)
    
    containerStackView.snp.makeConstraints { make in
        // constrain to safe area, not to superView
        make.top.left.right.bottom.equalTo(view.safeAreaLayoutGuide).inset(20)
    }
    headerLabel.snp.makeConstraints { make in
        make.top.centerX.equalToSuperview()
        // constrain label bottom to superview
        make.bottom.equalToSuperview()
    }
    doneButton.snp.makeConstraints { make in
        make.top.right.equalToSuperview()
        // constrain button bottom to superview
        make.bottom.equalToSuperview()
    }
    workoutInput.snp.makeConstraints {make in
        make.height.equalTo(40)
    }
}

另外,如果为UI元素提供对比背景色,您会发现调试布局要容易得多,例如:

代码语言:javascript
运行
复制
    header.backgroundColor = .systemTeal
    headerLabel.backgroundColor = .yellow
    doneButton.backgroundColor = .green

通过这些更改,您应该看到以下内容:

票数 1
EN

Stack Overflow用户

发布于 2021-07-12 04:15:53

我相信您应该能够在header.frame.size.height = [height]函数中执行viewDidLoad(),并且它应该这样修改它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68340966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档