ios - 嵌套的 UIStackViews 打破约束

标签 ios cocoa-touch autolayout interface-builder uistackview

我有一个复杂的 View 层次结构,内置在 Interface Builder 中,带有嵌套的 UIStackViews。每次我隐藏一些内部堆栈 View 时,我都会收到“无法满足的约束”通知。我已经追踪到这一点:

(
    "<NSLayoutConstraint:0x1396632d0 'UISV-canvas-connection' UIStackView:0x1392c5020.top == UILabel:0x13960cd30'Also available on iBooks'.top>",
    "<NSLayoutConstraint:0x139663470 'UISV-canvas-connection' V:[UIButton:0x139554f80]-(0)-|   (Names: '|':UIStackView:0x1392c5020 )>",
    "<NSLayoutConstraint:0x139552350 'UISV-hiding' V:[UIStackView:0x1392c5020(0)]>",
    "<NSLayoutConstraint:0x139663890 'UISV-spacing' V:[UILabel:0x13960cd30'Also available on iBooks']-(8)-[UIButton:0x139554f80]>"
)

具体来说,UISV-spacing 约束:当隐藏 UIStackView 时,它的高约束得到一个 0 常量,但这似乎与内部 stackview 的间距约束冲突:它需要我的 Label 和按钮,与隐藏约束不协调,因此约束崩溃。

有解决办法吗?我已尝试递归隐藏隐藏堆栈 View 的所有内部 StackView,但这会导致内容浮出屏幕的奇怪动画,并导致启动时 FPS 严重下降,但仍未解决问题。

最佳答案

这是隐藏嵌套堆栈 View 的已知问题。

这个问题基本上有 3 种解决方案:

  1. 将间距更改为 0,但您需要记住之前的间距值。
  2. 调用 innerStackView.removeFromSuperview(),但随后您需要记住在何处插入堆栈 View 。
  3. 用至少一个 999 约束将堆栈 View 包装在 UIView 中。例如。 top@1000, leading@1000, trailing@1000, bottom@999.

我认为第三个选项是最好的。有关此问题、发生原因、不同解决方案以及如何实现解决方案 3 的更多信息,请参阅 my answer to a similar question .

关于ios - 嵌套的 UIStackViews 打破约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33073127/

相关文章:

ios - 如何在 ViewController 中将 AVPlayer 添加到 UIView

ios - 带有核心图像过滤器的 EAGLContext

ios - Parse.com 是否支持提示用户同意条款和隐私政策协议(protocol)

didReceiveMemoryWarning 后 iOS UITableView 空白

ios - 具有粘性页脚 UIView 和动态高度内容的 UIScrollView

swift - 删除广告横幅,不能使应用程序成为全屏

ios - 带有 tableview dequeueReusableCellWithIdentifier 的 Nil 导出

iOS removeFromSuperview 如果未添加到 superview 不会引发错误

ios - 类似于存折的下拉 View 类

swift - 滚动后调整单元格大小(自动布局)