我知道很多人已经问了很多关于这个的问题,但即使有了答案,我也不能让它起作用.

当我处理故事板上的约束时,这很容易,但在代码中我很难.

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 748)];
myView.backgroundColor = [UIColor redColor];
[self.view addSubview:myView];
[self.view addConstraints:[NSLayoutConstraint
    constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
    options:0 metrics:nil
    views:NSDictionaryOfVariableBindings(myView)]];

它不满足某些约束条件.我看不出有什么不对劲.另外,为什么我不能使用像self.myView这样的属性,而不能使用像myView这样的局部变量呢?

推荐答案

在代码中使用"自动布局"时,设置框架不起任何作用.因此,当您对上面的视图设置约束时,您在上面的视图上指定的宽度为200并不意味着什么.为了使视图的约束集明确,它需要四个条件:任意给定状态的x位置、y位置、宽度和高度.

目前在上面的代码中,您只有两个(相对于SuperView的高度和相对于SuperView的y位置).除此之外,您还需要两个可能冲突的约束,具体取决于视图的SuperView约束的设置方式.If如果SuperView有一个必需的约束,该约束指定它的高度小于748,您将得到一个"无法满足的约束"异常.

在设置约束之前设置了视图的宽度这一事实毫无意义.它甚至不会考虑旧框架,而是会根据为这些视图指定的所有约束计算新框架.在代码中处理autolayout时,我通常只使用initWithFrame:CGRectZeroinit创建一个新视图.

要创建问题中口头描述的布局所需的约束集,需要添加一些水平约束来约束宽度和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美元.

Ios相关问答推荐

如何保持拖动预览与原始项目完全相同?

UIBezierPath包含:方法不检测到厚度大于1像素的线上的touch

如何创建自定义组件来接受(和传递)所有可能的Textfield参数?

更改文本在Flutter 中的位置

当包含UITextView的inputAccessoryView显示键盘时,iOS UITableView内容会出现UINavigationBar奇怪的错误

底部导航栏在iOS上浮动

如何使用Xcode15.1在iMessage扩展模块中显示贴纸

快速 keys 串更新只有在第二次try 时才起作用

如何在Combine发布者之间强制执行最小延迟

Flutter iOS 构建失败:DVTCoreDeviceEnabledState_Disabled

UIView 阴影不适用于自定义扩展

将值传递给导航链接视图中的文本框

如何关闭情节提要弹出框

为什么 Safari 在使用 iOS 6 设备进行远程调试时显示No Inspectable Applications?

interfaceOrientation在 iOS 8 中已弃用,如何更改此方法 Objective C

在 Xcode 4 中将静态库链接到 iOS 项目

如何使用 Contacts Framework 获取 iOS 9 中的所有联系人记录

如何像在 Facebook 应用程序中一样以编程方式打开设置?

iOS SDK - 以编程方式生成 PDF 文件

如何防止 iOS 设备上的显示屏变暗和关闭?