swift - 高度约束,lessThanOrEqualToConstant,但如果可能会尝试实现常量
问题描述
我有两个视图,previewSection 和 settingsEditSection。我正在尝试布局这些视图以实现以下目标:
- previewSection 的顶部锚定到父视图的顶部
- 如果可能, previewSection 的高度为 400,但如果需要 settingsEditSection 以达到其最小高度,它会更小
- settingsEditSection 的顶部锚定到 previewSection 的底部
- settingsEditSection 的底部锚定到父视图的底部
- settingsEditSection 的高度至少为150
我的问题是,当我给 previewSection 一个高度时,lessThanOrEqualToConstant: 400
它的实际高度为 0。
有什么办法让我说:“lessThanOrEqualToConstant,x 的高度,只要有空间,就有 x 的高度”?
我希望 settingsEditSection 的高度为 150 为第一优先级,然后在使其变大之前,尽可能将 previewSection 设置为 400,如果之后还有空间,那么 settingsEditSection 可以大于 150 来填充空间。
这是我编写的代码,对我来说最有意义:
let previewSection = PreviewSection()
view.addSubview(previewSection)
let settingsEditSection = SettingsEditSection()
view.addSubview(settingsEditSection)
// Preview section
previewSection.translatesAutoresizingMaskIntoConstraints = false
previewSection.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
previewSection.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
previewSection.topAnchor.constraint(equalTo: view.topAnchor, constant: topMargin).isActive = true
previewSection.heightAnchor.constraint(lessThanOrEqualToConstant: 400).isActive = true
previewSection.bottomAnchor.constraint(equalTo: settingsEditSection.topAnchor).isActive = true
// Settings & edit section
settingsEditSection.translatesAutoresizingMaskIntoConstraints = false
settingsEditSection.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
settingsEditSection.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
settingsEditSection.bottomAnchor.constraint(equalTo: upgradeButton.topAnchor).isActive = true
settingsEditSection.heightAnchor.constraint(greaterThanOrEqualToConstant: 150).isActive = true
settingsEditSection.topAnchor.constraint(equalTo: previewSection.bottomAnchor).isActive = true
现在,previewSection 的高度为 0,然后 settingsEditSection 的高度刚好跨越整个父视图。
对我来说,这个问题的背景是我正在构建这个配置文件页面,并布置配置文件和按钮以在 iPhone X 和 iPhone 5S 上看起来最好,这是最好的方法。
解决方案
您可以在此处使用约束优先级。后
previewSection.heightAnchor.constraint(lessThanOrEqualToConstant: 400).isActive = true
您可以再添加一个提供默认高度的约束,但优先级较低。像这样,
let previewSectionHeight = previewSection.heightAnchor.constraint(equalToConstant: 400)
previewSectionHeight.priority = .defaultHigh
previewSectionHeight.isActive = true
这将使 previewSection 的高度为 400,直到 settingsEditSection 将其向上推以使其变小。要使所有这些工作,您还需要为 previewSection 和 settingsEditSection 的容器视图提供恒定的高度。
推荐阅读
- javascript - 如何更改此 iframe 的大小?
- java - 方法 publishProgress 必须从工作线程调用,目前推断线程为主线程
- windows - 无法从沙箱中重命名文件
- gcloud - 我们可以使用 gmail 帐户一次性登录多个 gcloud 项目吗?
- android - Kotlin 多平台:集成引用托管 git 存储库的 cocoapods?
- node.js - 编写一个打印“Hello World!”的nodejs程序 作为应用程序所有路由的输出
- javascript - 向数组添加常用对象和格式
- node.js - ExpressJS 中的 API 错误处理和数据验证
- c# - 使用 travis 和 sonarcloud 分析 c# 项目给出“没有代码行”
- php - 如何获取从laravel中的url收集的数据?