Подтвердить что ты не робот

Как разместить дочернее представление относительно размера представления?

Я хочу, чтобы мой ребенок мог разместить 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'

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

4b9b3361

Ответ 1

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

Вместо этого вы можете сделать что-то вроде...

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

Ответ 2

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

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