如何相对于包含视图大小定位子视图?

cir*_*ego 13 ios autolayout

我希望能够将我的子视图从顶部定位为超级视图大小的25%.

NSLayoutConstraint *topPositionConstraint = [NSLayoutConstraint  constraintWithItem:_containerView 
                                                                          attribute:NSLayoutAttributeTop 
                                                                          relatedBy:NSLayoutRelationEqual 
                                                                             toItem:_childView 
                                                                          attribute:NSLayoutAttributeHeight 
                                                                         multiplier:0.25f 
                                                                           constant:0.0f];
Run Code Online (Sandbox Code Playgroud)

但是,现在我得到以下异常:

'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Invalid pairing of layout attributes'
Run Code Online (Sandbox Code Playgroud)

为什么会出现错误,如何实现我想要的?

Mic*_*ire 23

如果您使用底部而不是高度,则可以将百分比移动到乘数,而不是像在接受的答案中那样使用框架.我正在使用这种技术进行基于百分比的子视图定位.它也很好,因为在创建约束时可能无法设置容器视图的框架:

NSLayoutConstraint *topPositionConstraint =
    [NSLayoutConstraint  constraintWithItem:_childView
                              attribute:NSLayoutAttributeTop 
                              relatedBy:NSLayoutRelationEqual 
                                 toItem:_containerView
                              attribute:NSLayoutAttributeBottom 
                             multiplier:0.25 
                               constant:0];
Run Code Online (Sandbox Code Playgroud)

  • 太棒了.他们不允许NSLayoutAttributeTop和NSLayoutAttributeHeight彼此兼容(它们只是数字!!),甚至没有在任何地方的文档中提到它(除非我遗漏了一些东西).谢谢你的解决方案. (3认同)

Fog*_*ter 7

您不能在同一约束中使用top和height.虽然说系统不喜欢它是有道理的.

你可以做的是......

NSLayoutConstraint *topPositionConstraint =
    [NSLayoutConstraint  constraintWithItem:_childView
                                  attribute:NSLayoutAttributeTop 
                                  relatedBy:NSLayoutRelationEqual 
                                     toItem:_containerView
                                  attribute:NSLayoutAttributeTop 
                                 multiplier:1.0 
                                   constant:_containerView.frame.size.height * 0.25];
Run Code Online (Sandbox Code Playgroud)