嵌套 UIStackViews 打破约束

2024-05-11

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

(
    "<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 和 Button 之间需要 8 个点,这与隐藏约束不相容,因此约束崩溃。

有没有解决的办法?我尝试递归隐藏隐藏堆栈视图的所有内部 StackView,但这会导致奇怪的动画,其中内容浮出屏幕,并导致启动时的 FPS 严重下降,同时仍然无法解决问题。


这是隐藏嵌套堆栈视图的一个已知问题。

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

  1. 将间距更改为 0,但随后您需要记住之前的间距值。
  2. Call innerStackView.removeFromSuperview(),但是您需要记住在哪里插入堆栈视图。
  3. 将堆栈视图包装在具有至少一个 999 约束的 UIView 中。例如。顶部@1000、前导@1000、尾随@1000、底部@999​​。

我认为第三个选项是最好的。有关此问题、发生原因、不同解决方案以及如何实施解决方案 3 的详细信息,请参阅我对类似问题的回答 https://stackoverflow.com/a/38064687/35690.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套 UIStackViews 打破约束 的相关文章

随机推荐