空的 UIStackView 导致不明确的高度/位置

Posted

技术标签:

【中文标题】空的 UIStackView 导致不明确的高度/位置【英文标题】:Empty UIStackView causes ambiguous hieght/position 【发布时间】:2019-10-19 11:41:31 【问题描述】:

我有两个视图,一个UIView 和一个UIStackView

let mainView = UIView()
mainView.translatesAutoresizingMaskIntoConstraints = false

let stackView = UIStackView()
stackView.axis = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false

它们都被添加到具有这些约束的superView

NSLayoutConstraint.activate([
    mainView.topAnchor.constraint(equalTo: view.topAnchor),
    mainView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    mainView.leadingAnchor.constraint(equalTo: view.leadingAnchor),

    stackView.topAnchor.constraint(equalTo: mainView.bottomAnchor),
    stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])

UIViewUIStackView 不包含任何其他视图时,我在debugger 中的两个视图上都会收到警告

uiview 的高度不明确

uistackview 的高度和垂直位置不明确

但是,如果我将UIButton 添加到UIStackView,然后使用.isHidden = true 将其设置为隐藏,则两个警告都消失了,但ios10 仍然存在两个警告。

无论有没有debugger warnings,我都会得到我想要的结果,如果UIStackView 为空(或所有subviews 隐藏),UIView 会覆盖整个屏幕。

这里发生了什么,为什么一个隐藏视图与一个空的 stackView 不一样,为什么iOS10 的行为不同?最后但并非最不重要的一点是,如何在不影响当前布局的情况下满足 iOS10,这似乎适用于 iOS10 之后的所有内容?

【问题讨论】:

尝试将按钮 alpha 设置为 0 而不是隐藏按钮。 @DavidH 这有点用,我没有收到任何调试器警告/冲突,但 stackview 将始终具有按钮的高度,我希望另一个视图能够伸展到我的全部高度超级查看所有按钮是否隐藏 添加一个填充视图——我就是这么做的。给它大小限制。如果您不需要按钮,请将其删除,然后将填充视图上的约束设置为您想要的。您可以将填充视图保留在堆栈视图中或添加和删除它。 @DavidH 添加填充视图,并将其设置为 heightConstraintequalToConstant: 0 实际上删除了调试器警告,谢谢! (仍然认为它的工作原理非常奇怪..) 【参考方案1】:

这就是你得到的——mainViewstackView 没有高度并且边缘被剪裁。 没有办法根据这些约束计算垂直位置和高度。您可以在任一视图上添加一些高度约束,以明确自动布局

mainView.heightAnchor.constraint(greaterThanOrEqualToConstant: 1) 

【讨论】:

不起作用,仍然有相同的警告(尝试将其添加到两个视图)

以上是关于空的 UIStackView 导致不明确的高度/位置的主要内容,如果未能解决你的问题,请参考以下文章

Xcode IB 警告 UICollectionViewCell 中 UIStackView 的位置不明确,尽管它不应该是

防止 UIStackView 压缩 UITableView

将视图添加到 UIStackView 后 UITableViewCell 不更新高度

UIStackView 宽度和高度不改变以下元素添加

UITableViewCell 中带有多行标签的 UIStackView 高度不正确

UIStackView 动态高度图片