在代码中使用"自动布局"时,设置框架不起任何作用.因此,当您对上面的视图设置约束时,您在上面的视图上指定的宽度为200并不意味着什么.为了使视图的约束集明确,它需要四个条件:任意给定状态的x位置、y位置、宽度和高度.
目前在上面的代码中,您只有两个(相对于SuperView的高度和相对于SuperView的y位置).除此之外,您还需要两个可能冲突的约束,具体取决于视图的SuperView约束的设置方式.If如果SuperView有一个必需的约束,该约束指定它的高度小于748,您将得到一个"无法满足的约束"异常.
在设置约束之前设置了视图的宽度这一事实毫无意义.它甚至不会考虑旧框架,而是会根据为这些视图指定的所有约束计算新框架.在代码中处理autolayout时,我通常只使用initWithFrame:CGRectZero
或init
创建一个新视图.
要创建问题中口头描述的布局所需的约束集,需要添加一些水平约束来约束宽度和x位置,以便提供完全指定的布局:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
口头描述此布局的内容如下,从垂直约束开始:
MyView将使用顶部和底部填充填充其SuperView的高度
等于标准空间.MyView的SuperView有一个最小高度
748分.MyView的宽度为200pt,右填充等于
相对于其SuperView的标准空间.
如果您只想让视图填充整个SuperView的高度,而不限制SuperView的高度,那么只需在视觉格式文本中省略(>=748)
参数即可.如果您认为需要参数(>=748)
来赋予高度-在本例中不需要这样做:使用BAR(|
)或BAR WITH SPACE(|-
,-|
)语法将视图固定到SuperView的边缘,则为视图指定了y位置(将视图固定在单边上)和Y位置(将视图固定在两条边上),从而满足了为视图设置的约束.
关於你的第二个问题:
使用NSDictionaryOfVariableBindings(self.myView)
(如果您为MyView设置了属性)并将其输入到您的VFL中以在您的VFL文本中使用self.myView
,当autolayout试图解析您的VFL文本时,您可能会得到一个异常.它与字典键中的点符号和系统try 使用valueForKeyPath:
有关.See here for a similar question and answer美元.