2013-03-28 4 views
0

Auto Layout делает что-то, что не имеет смысла для меня, но, надеюсь, к одному из вас:Auto Layout не в состоянии удовлетворить ограничения при добавлении более 4 подвидов

У меня есть UIView containerView и 5 UIViews coverview1- coverview5. Я хочу разместить эти 5 обложки рядом друг с другом в контейнереView: та же ширина, то же самое выравнивание по нижнему краю, без интервала в любом месте, например | [__] [__] [__] [__] [__] |

Так что я делаю:

[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: 
    @"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)][coverview4(==coverview1)][coverview5(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]]; 

и я получаю:

Unable to simultaneously satisfy constraints. 
(
    "<NSLayoutConstraint:0x1d5ae4f0 ItemView:0x1d58f6f0.centerX == ItemView:0x1d580410.centerX>", 
    "<NSLayoutConstraint:0x1d5ae470 ItemView:0x1d58f6f0.centerX == ItemView:0x1d59b480.centerX>", 
    "<NSLayoutConstraint:0x1d5aed70 ItemView:0x1d580410.centerX == ItemView:0x1d59b480.centerX>" 
) 
Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1d5ae470 ItemView:0x1d58f6f0.centerX == ItemView:0x1d59b480.centerX> 

Странная вещь, я не получаю предупреждение, если я одно из следующих действий:

[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: 
    @"H:|[coverview1(>=0)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]]; 
//or 
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: 
    @"H:|[coverview1(>=0)][coverview2(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]]; 
//or 
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: 
    @"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]]; 
//or 
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: 
    @"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)][coverview4(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]]; 
//or 
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: 
    @"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)][coverview5(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]]; 

(последние два не совпадают, так как я заменил coverview4 на coverview5)

Почему я могу добавить только до 4 просмотров? Почему добавление пятого результата приводит к внезапной проблеме с выравниванием по центру centerX?

ответ

2

Там отличный намек в сообщении об ошибке:

Unable to simultaneously satisfy constraints.

Так, изучая ограничения показывают, в случае ошибки:

"<NSLayoutConstraint:0x1d5ae4f0 ItemView:0x1d58f6f0.centerX == ItemView:0x1d580410.centerX>", 
    "<NSLayoutConstraint:0x1d5ae470 ItemView:0x1d58f6f0.centerX == ItemView:0x1d59b480.centerX>", 
    "<NSLayoutConstraint:0x1d5aed70 ItemView:0x1d580410.centerX == ItemView:0x1d59b480.centerX>" 

Мы можем видеть, что есть два ограничения, которые определяют то же самое на ItemView пример 0x1d58f6f0. Первый говорит, что это centerX должно быть таким же, как ItemView пример 0x1d580410centerX.

Второй говорит, что это centerX должно быть таким же, как ItemView пример 0x1d59b480centerX.

Итак, у нас есть два ограничения, которые противоречат друг другу. Они оба пытаются сказать, что ItemView где поставить горизонтальный центр, и оба они дают разные инструкции. Подумайте о двух криках на вас, одновременно говоря, что вы стоите в двух разных местах.

В режиме автоматического компоновки макетов лучше всего справиться с этим. Два противоречивых ограничения? Игнорируйте один из них. В этом случае он игнорирует или «ломает» ограничение 0x1d5ae470.

Как насчет ваших других ограничений, которые работают? Почему они работают с четырьмя видами, а не с пятью? Мы должны учитывать, что время выполнения Auto Layout будет пытаться выложить виды в окне контейнера в соответствии с вашими пожеланиями. С четырьмя видами он может делать то, что вы хотите. С пятью видами он пытается сделать, чтобы делать то, что вы хотите, и терпит неудачу. Это зависит от установленных ограничений. Если взгляды должны быть выровнены последовательно горизонтально, это можно сделать, учитывая размер контейнера? Если нет, вам понадобятся горизонтальные ограничения ширины, которые позволят уменьшить ширину ItemView, чтобы пять могли хорошо сочетаться.

Еще одна вещь, о которой стоит подумать, - это то, что вы создали эти представления coverview1 через coverview5 программно или если они настроены внутри Xib. У обоих есть проблемы. Если вы добавили их программно, вам необходимо установить флаг translatesAutoresizingMaskIntoConstraints в NO, чтобы предотвратить добавление ограничений авторезистации по умолчанию и, без сомнения, конфликт с установленными ограничениями.

В качестве альтернативы, если вы создали эти представления в Xib, вам необходимо программно удалить любые существующие ограничения, которые заставил интерфейс Builder. В противном случае они могут противоречить тем, которые вы добавили программным путем, используя язык визуального формата.