2013-07-04 1 views
13

Я хочу, чтобы у меня был вид моего ребенка на 25% размером с супер-вид сверху.Как разместить дочерний вид относительно содержащего размер представления?

NSLayoutConstraint *topPositionConstraint = [NSLayoutConstraint constraintWithItem:_containerView 
                      attribute:NSLayoutAttributeTop 
                      relatedBy:NSLayoutRelationEqual 
                      toItem:_childView 
                      attribute:NSLayoutAttributeHeight 
                     multiplier:0.25f 
                      constant:0.0f]; 

Однако, сейчас я получаю следующее исключение:

'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Invalid pairing of layout attributes' 

Почему происходит ошибка, и как я могу добиться того, что я хочу?

ответ

6

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

Что вы могли бы сделать вместо того, чтобы что-то вроде ...

NSLayoutConstraint *topPositionConstraint = 
    [NSLayoutConstraint constraintWithItem:_childView 
            attribute:NSLayoutAttributeTop 
            relatedBy:NSLayoutRelationEqual 
            toItem:_containerView 
            attribute:NSLayoutAttributeTop 
           multiplier:1.0 
            constant:_containerView.frame.size.height * 0.25]; 
+0

Это отлично поработало после того, как я поменял местами представления ребенка и контейнера. – circuitlego

+0

Извините, да, вы правы. Вы устанавливаете ограничение на childView, чтобы оно было первым. – Fogmeister

+1

Просто обратите внимание, что «_containerView.frame.size.height» будет отличаться в ландшафтном и портретном режимах. Таким образом, если начать с ландшафтного режима, расчетное значение будет не таким, как при стартовом режиме в портретном режиме. – Vanja

22

Вместо того, чтобы использовать кадр как в принятом ответе, вы можете переместить процент в умножитель, если вы используете дно вместо высоты. Я использую эту технику для определения местоположения детей в процентах. Это также хорошо, потому что рамка вашего вида контейнера не может быть установлена ​​при создании ограничения:

NSLayoutConstraint *topPositionConstraint = 
    [NSLayoutConstraint constraintWithItem:_childView 
           attribute:NSLayoutAttributeTop 
           relatedBy:NSLayoutRelationEqual 
           toItem:_containerView 
           attribute:NSLayoutAttributeBottom 
          multiplier:0.25 
           constant:0]; 
+0

Правильно ли это, если у содержимого keeperview нет его начала кадра в 0,0? –

+3

ЭТО отлично. Это означает, что они не разрешали NSLayoutAttributeTop и NSLayoutAttributeHeight быть совместимыми друг с другом (они просто цифры !!) и даже не указали его в документах нигде (если я не пропустил что-то). Спасибо за это решение. –

+0

Удивительный, это должен быть принятый ответ, без кадрового твика – Max

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

  • Нет связанных вопросов^_^