Ios 如何相对于包含视图大小定位子视图?
我希望能够从顶部定位我的子视图,大小为超级视图的25%Ios 如何相对于包含视图大小定位子视图?,ios,autolayout,Ios,Autolayout,我希望能够从顶部定位我的子视图,大小为超级视图的25% NSLayoutConstraint *topPositionConstraint = [NSLayoutConstraint constraintWithItem:_containerView attribute:NSLayoutAttributeTop
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相互兼容(它们只是数字!!),甚至在任何地方的文档中都没有提到它(除非我遗漏了什么)。谢谢你的解决方案。太棒了,这应该是公认的答案,没有框架