未设置 NIB“使用自动布局”时,我可以使用 NSLayoutConstraint 吗?

Posted

技术标签:

【中文标题】未设置 NIB“使用自动布局”时,我可以使用 NSLayoutConstraint 吗?【英文标题】:Can I use NSLayoutConstraint when the NIB "Use Autolayout" is not set? 【发布时间】:2013-01-23 10:03:51 【问题描述】:

我现有的 Mac 应用程序使用 Springs 和 Struts 并且运行良好,但我想在我的一个 NIB 内的单个视图中使用“自动布局”。我将以编程方式提供这些约束(因为使用 IB 配置约束是一场彻头彻尾的噩梦)。

我的问题是,当 NSLayoutConstraint 对象包含在未选中“使用自动布局”的 NIB 中时,我可以在视图上设置它吗?

【问题讨论】:

【参考方案1】:

好的,所以这个问题的简短回答是“是”,即使 NIB 关闭了“使用自动布局”,您也可以使用 NSLayoutConstraints。

这是我视图的awakeFromNib 方法:

- (void)awakeFromNib

    NSDictionary *viewsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                     _field1, @"field1",
                                     _field2, @"field2",
                                     _field3, @"field3",
                                     nil];

    // Turn off conversion of Springs and Struts into NSLayoutConstraints for all the controls
    for (NSControl *control in [viewsDictionary allValues])
    
        [control setTranslatesAutoresizingMaskIntoConstraints:NO];
    

    NSString *hformat = @"H:|-4-[field1(>=48)]-[field2]-[field3(==field1)]-4-|";
    NSArray *hconstraints = [NSLayoutConstraint constraintsWithVisualFormat:hformat
                                                                    options:0
                                                                    metrics:0
                                                                      views:viewsDictionary];

    [self addConstraints:hconstraints];

    // Vertical layout (must be done for each control separately)
    for (NSString *controlName in [viewsDictionary allKeys])
    
        NSString *vformat = [NSString stringWithFormat:@"V:|-4-[%@]", controlName];
        NSArray *vconstraints = [NSLayoutConstraint constraintsWithVisualFormat:vformat
                                                                        options:0
                                                                        metrics:0
                                                                          views:viewsDictionary];

        [self addConstraints:vconstraints];
    



    // Other init

一些注意事项:

字段比上面显示的要多得多;我已经简化了在此处发布的代码。 有问题的视图位于拆分视图中,为了在超级视图调整大小时能够正确调整其大小,我确实致电[self setTranslatesAutoresizingMaskIntoConstraints:NO]; 您需要为所有使用 Auto Layout 约束的子视图停止 Springs 和 Struts 的翻译。 other 拆分视图窗格中有一个滚动视图,我必须在该滚动视图上调用 setTranslatesAutoresizingMaskIntoConstraints:NO,否则会引发异常。

【讨论】:

以上是关于未设置 NIB“使用自动布局”时,我可以使用 NSLayoutConstraint 吗?的主要内容,如果未能解决你的问题,请参考以下文章

RootViewController 视图未使用自动布局调整大小

使用自动布局查找笔尖

iOS,标题中自定义单元格的边距与行不同,自动布局?

错误:线程 1:“无法设置未准备好约束的视图层次结构的布局。”使用自动布局时

未选中使用自动布局时导航栏丢失

iOS 编程将 Storyboard 转换为 NIB