2015-07-11 3 views
2

У меня возникли некоторые проблемы с Autolayoutшириной на всех размерах экрана для расширения клавиатуры.Почему autolayout есть проблемы с этим макетом

Сначала он работал нормально, но затем внезапно начал выплевывать ряд ошибок, независимо от ширины экрана. Я ничего не менял, я даже пытался удалить приложение, очистить проект и выложить все с нуля.

Это мой макет:

| - 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 inch экран.

Насколько я вижу, не должно быть никаких проблем, так как максимальная ширина элементов (8 + 50 + 8 + 130 + 8 + 130 + 8) 342 очка. Это меньше, чем экраны 4.7 и 5.5 inch. На 4-дюймовый, я решаю это, разбив 50-ти точечную ширину на кнопке 1, поэтому общее число составляет 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

По какой-то причине супервизор, по крайней мере, временно, всего 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)]>" 

Итак, | (ребра SuperView в) является UIView:0x137e0c1b0 и который ограничен в широких 55 пунктов (UIView:0x137e0c1b0(55)).

Этот вид, по-видимому, контролируется каркасами. Вы должны приспособить его к любой произвольной ширине (даже 0, как в последнем исключении). Для этого сделайте одну из ограничений горизонтального интервала очень высокой, но не обязательной, приоритетом, например 950. Таким образом, она будет удерживаться, если возможно, но будет разбита, не вызывая исключения, если это необходимо. Очевидным выбором является ограничение на задний фронт супервизора.

Случаи, когда надстройка уже, чем экран, предположительно, когда иерархия представлений собрана вместе, прежде чем она будет показана. Таким образом, ограничение ограничения в это время не повлияет на какой-либо реально видимый макет.

+0

Возможно, я должен был упомянуть, что это пользовательское расширение клавиатуры. Есть ли у вас опыт в этом, это общая проблема или что-то, что я вызвал? – Aleksander

+0

Извините, я об этом не знаю. –

+0

Это прекрасно, я думаю, что в какой-то момент я узнаю. На данный момент, однако, снижение приоритета ограничения на задний край супервизора делало трюк! Благодаря! – Aleksander

1

Если я не ошибаюсь ... Похоже, что у вас есть постоянная ширина & ограничений по марке на вашей кнопке «Pasteboard» и «Last Scentence».

Вы ограничиваете сторону экрана, уже объявляя ширину. Поэтому, когда выполняется автоматическая компоновка, она (понятно) не знает, какое ограничение использовать. Таким образом, он ограничивает ограничения ширины на обеих ваших кнопках и использует другие ограничения полей для установки ширины.

+0

Да, обе кнопки имеют ширину в 130 точек, между ними есть 8-точечное пространство, а также 8 точек между кнопкой «последнее предложение» и надписью. Однако это необходимо, так как кнопки всегда должны быть шириной 130. Это промежуток между кнопкой «картон» и глобусом, который должен опускаться, а затем кнопка с 50 точками глобуса должна в конечном итоге сломаться. Однако на больших экранах ничто не должно ломаться. – Aleksander

+0

Я случайно нажал кнопку ввода на моем последнем сообщении. См. Его снова для обновленного комментария. – Aleksander

+0

Именно поэтому я понимаю это правильно, когда экран становится меньше по ширине, вы хотели бы, чтобы две кнопки сохранили свою ширину 130 пикселей и земной шар, чтобы потерять ее ширину, но макс в 50 пикселей? – Oxcug

Смежные вопросы