我在键盘扩展程序的所有屏幕尺寸上遇到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
。
这不仅会导致 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']>
整个晚上我一直在摸不着头脑。你们有什么建议吗?
答案 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)
如果我没弄错的话......看起来你的宽度不变了“粘贴板”和“最后一刻”按钮的边距限制。
你对屏幕一侧的约束已经在宣告宽度。因此,当自动布局运行时,它(可以理解)不知道要使用哪个约束。因此,它打破了两个按钮的宽度限制,并使用其他边距约束来设置宽度。