高度约束,lessThanOrEqualToConstant,但尽可能尝试实现常量
Posted
技术标签:
【中文标题】高度约束,lessThanOrEqualToConstant,但尽可能尝试实现常量【英文标题】:Height constraint, lessThanOrEqualToConstant, but tries to achieve the constant if possible 【发布时间】:2019-09-07 05:31:58 【问题描述】:我有两个视图,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 的高度刚好跨越整个父视图。
对我来说,这个问题的背景是我正在构建 this profile page,并布置配置文件和按钮以在 iPhone X 和 iPhone 5S 上看起来最好,这是最好的方法。
【问题讨论】:
容器视图的高度是多少? @ShreeramBhat,这取决于设备。但它是设备的全宽,可能比设备的高度小约 100 像素 没关系。最主要的是容器视图高度它本身不应该依赖于子视图的高度,以上的东西可以工作。你可以试试我下面贴的代码。 【参考方案1】:您可以在此处使用约束优先级。之后
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 的容器视图提供恒定的高度。
【讨论】:
以上是关于高度约束,lessThanOrEqualToConstant,但尽可能尝试实现常量的主要内容,如果未能解决你的问题,请参考以下文章