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

Ios 如何相对于包含视图大小定位子视图?,ios,autolayout,Ios,Autolayout,我希望能够从顶部定位我的子视图,大小为超级视图的25% NSLayoutConstraint *topPositionConstraint = [NSLayoutConstraint constraintWithItem:_containerView attribute:NSLayoutAttributeTop

我希望能够从顶部定位我的子视图,大小为超级视图的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'

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

不能在同一约束中使用“顶”和“高度”。尽管这样说是有道理的,但系统不喜欢它

你可以做的是像

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

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

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

在我交换了子视图和容器视图之后,这非常有效。对不起,是的,你是对的。您正在对childView设置约束,因此它应该是第一个。只需注意“\u containerView.frame.size.height”在横向和纵向模式下会有所不同。因此,如果从横向模式开始,计算值将与从纵向模式开始时不同。这完全取决于_containerView是什么。仅仅因为你改变了方向,并不意味着高度会改变。@Vanja的观点是正确的。如果OP的目的是填充25%的屏幕,则不会在方向改变时更新。希望我们能将宽度/高度和顶部/左侧属性配对!当containerview的帧原点不在0,0时,这是否正确?这是完美的。令人遗憾的是,他们不允许NSLAYUTATTRIBUTETOP和NSLAYUTATTRIBUTEHEIGHT相互兼容(它们只是数字!!),甚至在任何地方的文档中都没有提到它(除非我遗漏了什么)。谢谢你的解决方案。太棒了,这应该是公认的答案,没有框架