未设置 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 关闭了“使用自动布局”,您也可以使用 NSLayoutConstraint
s。
这是我视图的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 视图未使用自动布局调整大小