为什么autolayout存在此布局问题

时间:2015-07-11 20:18:42

标签: ios storyboard autolayout ios-autolayout

我在键盘扩展程序的所有屏幕尺寸上遇到Autolayout width 的问题。

起初它工作正常,但随后突然开始吐出一些错误,无论屏幕的宽度如何。我没有改变任何东西,我甚至尝试删除应用程序,清理项目,并从头开始布置所有内容。

这是我的布局:

| - 8 - (50) - >=8 - (130) - 8 - (130) - 8 - |
priority (50) = 750, everything else = 1000
  • 有一个8 point space between the superview and button 1,其中有一个width of 50, but a priority of 750
  • 然后是8 point or greater space between button 1 and button 2,其中有width of 130
  • 然后是8 point space between button 2 and button 3,其中还有一个width of 130
  • 最后有一个8 point space between button 3 and the superview

Screenshot of storyboard layout

这不仅会导致 320点 4英寸屏幕出现问题,还会导致 375点 4.7英寸屏幕和 414点 5.5英寸屏幕。

据我所知,不应该有任何问题,因为项目的最大宽度是(8 + 50 + 8 + 130 + 8 + 130 + 8) 342点。这比 4.7和5.5英寸屏幕都要少。在 4英寸上,我通过打破按钮1 上的 50点宽度来解决这个问题,因此总数 320点

它在模拟器和设备上看起来都很好,但是控制台会发出一些Unable to simultaneously satisfy constraints错误(确切地说是3个)。

这是日志:

1: (
"<NSLayoutConstraint:0x1740954a0 H:[UIButton:0x137e0cb80'Last sentence'(130)]>",
"<NSLayoutConstraint:0x1740955e0 H:[UIButton:0x137e0cda0'Pasteboard'(130)]>",
"<NSLayoutConstraint:0x174095810 H:|-(8)-[UIButton:0x137d0ba60]   (Names: '|':UIView:0x137e0c1b0 )>",
"<NSLayoutConstraint:0x1740958b0 H:[UIButton:0x137d0ba60]-(>=8)-[UIButton:0x137e0cda0'Pasteboard']>",
"<NSLayoutConstraint:0x174095950 H:[UIButton:0x137e0cda0'Pasteboard']-(8)-[UIButton:0x137e0cb80'Last sentence']>",
"<NSLayoutConstraint:0x1740959f0 H:[UIButton:0x137e0cb80'Last sentence']-(8)-|   (Names: '|':UIView:0x137e0c1b0 )>",
"<NSLayoutConstraint:0x170094ff0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x137e0c1b0(55)]>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x1740955e0 H:[UIButton:0x137e0cda0'Pasteboard'(130)]>

2: (
"<NSLayoutConstraint:0x1740954a0 H:[UIButton:0x137e0cb80'Last sentence'(130)]>",
"<NSLayoutConstraint:0x174095810 H:|-(8)-[UIButton:0x137d0ba60]   (Names: '|':UIView:0x137e0c1b0 )>",
"<NSLayoutConstraint:0x1740958b0 H:[UIButton:0x137d0ba60]-(>=8)-[UIButton:0x137e0cda0'Pasteboard']>",
"<NSLayoutConstraint:0x174095950 H:[UIButton:0x137e0cda0'Pasteboard']-(8)-[UIButton:0x137e0cb80'Last sentence']>",
"<NSLayoutConstraint:0x1740959f0 H:[UIButton:0x137e0cb80'Last sentence']-(8)-|   (Names: '|':UIView:0x137e0c1b0 )>",
"<NSLayoutConstraint:0x170094ff0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x137e0c1b0(55)]>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x1740954a0 H:[UIButton:0x137e0cb80'Last sentence'(130)]>

3: (
"<NSLayoutConstraint:0x174095810 H:|-(8)-[UIButton:0x137d0ba60]   (Names: '|':UIView:0x137e0c1b0 )>",
"<NSLayoutConstraint:0x1740958b0 H:[UIButton:0x137d0ba60]-(>=8)-[UIButton:0x137e0cda0'Pasteboard']>",
"<NSLayoutConstraint:0x174095950 H:[UIButton:0x137e0cda0'Pasteboard']-(8)-[UIButton:0x137e0cb80'Last sentence']>",
"<NSLayoutConstraint:0x1740959f0 H:[UIButton:0x137e0cb80'Last sentence']-(8)-|   (Names: '|':UIView:0x137e0c1b0 )>",
"<NSLayoutConstraint:0x170094ff0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x137e0c1b0(0)]>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x1740958b0 H:[UIButton:0x137d0ba60]-(>=8)-[UIButton:0x137e0cda0'Pasteboard']>

整个晚上我一直在摸不着头脑。你们有什么建议吗?

2 个答案:

答案 0 :(得分:2)

无论出于何种原因,超级视图至少暂时只有55分。从您引用的日志中:

"<NSLayoutConstraint:0x174095810 H:|-(8)-[UIButton:0x137d0ba60]   (Names: '|':UIView:0x137e0c1b0 )>",
...
"<NSLayoutConstraint:0x1740959f0 H:[UIButton:0x137e0cb80'Last sentence']-(8)-|   (Names: '|':UIView:0x137e0c1b0 )>",
"<NSLayoutConstraint:0x170094ff0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x137e0c1b0(55)]>"

因此,|(超级视图的边缘)为UIView:0x137e0c1b0,并且约束为55点宽(UIView:0x137e0c1b0(55))。

这种观点可能是由框架控制的。您需要适应任意宽度(即使是0,如上一个例外)。要做到这一点,请将其中一个水平间距约束设置得非常高,但不要求优先级,例如950.这样,如果可能的话,它将保持不变,但如果必须的话,它会被破坏而不会导致异常。显而易见的选择是对superview的后沿的约束。

超视图比屏幕窄的情况可能是在视图层次结构放在一起之前,在显示之前。因此,允许在那时破坏约束不会影响任何实际可见的布局。

答案 1 :(得分:1)

如果我没弄错的话......看起来你的宽度不变了“粘贴板”和“最后一刻”按钮的边距限制。

你对屏幕一侧的约束已经在宣告宽度。因此,当自动布局运行时,它(可以理解)不知道要使用哪个约束。因此,它打破了两个按钮的宽度限制,并使用其他边距约束来设置宽度。