【问题标题】:Height constraint, lessThanOrEqualToConstant, but tries to achieve the constant if possible高度约束,lessThanOrEqualToConstant,但尽可能尝试实现常量
【发布时间】: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 像素
  • 没关系。最主要的是容器视图高度它本身不应该依赖于子视图的高度,以上的东西可以工作。你可以试试我下面贴的代码。

标签: swift nslayoutconstraint


【解决方案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 的容器视图提供恒定的高度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多