2015-10-07 3 views
0

У меня довольно простой пользовательский интерфейс, который хорошо работает с ограничениямиWithVisualFormat, я попытался заменить это на constraintWithItem и по какой-то причине он не работает. Я не знаю, что здесь не так.Проблема с автоопределением с ограничением ограничений VSithWithItem VSWithualFormat

Буквальное предложение, которое я понял, это

Вертикально, то contentView должен заполнить всю высоту его надтаблицы без заполнения.

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView); 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" 
                   options:0 
                   metrics:nil 
                   views:viewsDictionary]; 
[containerView addConstraints:constraints]; 


//Below is my alternative code NOT working, but this should work too? 
NSLayoutConstraint *constraints = 
[NSLayoutConstraint constraintWithItem:contentView 
          attribute:NSLayoutAttributeHeight 
          relatedBy:NSLayoutRelationEqual 
           toItem:containerView 
          attribute:NSLayoutAttributeHeight 
          multiplier:1.0 
           constant:0]; 
[containerView addConstraint:constraints]; 

ответ

1

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

Вместо создания ограничения для высоты создайте два ограничения: один для верхнего поля и один для нижнего поля, закрепляющий края contentView в containerView.

+0

У меня также есть горизонтальное ограничение H: | [contentView] |, поэтому это значит, что мне тоже нужны левые и правые? Я думаю, что у меня проблема с переводом VFL –

+0

Да, то же самое относится и к горизонтали. – Jaanus

1

Вы должны изменить его с высоты на верхнюю. А также добавьте подобное ограничение в нижнее.

NSLayoutConstraint *constraints = 
[NSLayoutConstraint constraintWithItem:contentView 
          attribute:NSLayoutAttributeTop 
          relatedBy:NSLayoutRelationEqual 
           toItem:containerView 
          attribute:NSLayoutAttributeTop 
          multiplier:1.0 
           constant:0]; 
[containerView addConstraint:constraints]; 
0

Этот визуальный формат:

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView); 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" 
                   options:0 
                   metrics:nil 
                   views:viewsDictionary]; 
[containerView addConstraints:constraints]; 

следует заменить два ограничений:

NSLayoutConstraint *topConstraint = 
[NSLayoutConstraint constraintWithItem:contentView 
          attribute:NSLayoutAttributeTop 
          relatedBy:NSLayoutRelationEqual 
           toItem:containerView 
          attribute:NSLayoutAttributeTop 
          multiplier:1.0 
           constant:0]; 
[containerView addConstraint: topConstraint]; 

и

NSLayoutConstraint *bottomConstraint = 
[NSLayoutConstraint constraintWithItem:contentView 
          attribute:NSLayoutAttributeBottom 
          relatedBy:NSLayoutRelationEqual 
           toItem:containerView 
          attribute:NSLayoutAttributeBottom 
          multiplier:1.0 
           constant:0]; 
[containerView addConstraint:bottomConstraint]; 
+0

Итак, реальный вопрос может быть в том, что является буквальным переводом V: | [contentView] | и H: | [contentView] | –

+0

'V: | [contentView] |' означает «snap contentView вверху ** и ** в нижней части своего супер-представления», 'H: | [contentView] |' означает «привязать содержимоеViewView к ведущим ** и ** к завершению своего наблюдения ». Если вы установите параметр «NSLayoutFormatDirectionLeftToRight» в качестве опции, ведущие и конечные элементы заменяются влево и вправо. – psci

+0

@AtifImran, если вам действительно интересно, как преобразуется визуальный формат, вы можете перебирать массив ограничений. Этот массив содержит объекты NSLayoutConstraint, затем вы можете распечатать его debugDescription. – psci

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