在OSX 10.8中,如何将子视图约束为与其父视图相同的大小

ahw*_*ulf 9 macos cocoa constraints nsview

我在一个具有单个NSView的新应用程序中创建了默认的NSWindow.然后我创建一个新的NSViewController,它有自己的XIB和视图.在app委托中,我做了显而易见的事

self.mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
[self.window.contentView addSubview:self.mainViewController.view];
self.mainViewController.view.frame = ((NSView*)self.window.contentView).bounds;
Run Code Online (Sandbox Code Playgroud)

好的,我如何以新的方式设置约束,让我的子视图保持其大小与Window相同,即它是超级视图.它似乎不会自动运行.两个视图的Autoresizessubviews都为ON.

Tim*_*Tim 8

基本上,你需要约束四件事:

  1. 子视图的前导空间为superview,为零
  2. 子视图的顶层空间为superview,为零
  3. 的子视图等于它的父的宽度
  4. 子视图的高度等于其超视图的宽度

如果视觉约束不适合您,您可以在代码中单独构建这四个约束.使用该方法+constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier: constant:指定不同视图属性之间的确切关系.例如,上面的约束#1可以表示为:

[NSLayoutConstraint constraintWithItem:mySubview
                             attribute:NSLayoutAttributeLeading
                             relatedBy:NSLayoutRelationEqual
                                toItem:mySuperview
                             attribute:NSLayoutAttributeLeading
                            multiplier:1.0f
                              constant:0.0f]
Run Code Online (Sandbox Code Playgroud)

和#3可能是:

[NSLayoutConstraint constraintWithItem:mySubview
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                                toItem:mySuperview
                             attribute:NSLayoutAttributeWidth
                            multiplier:1.0f
                              constant:0.0f]
Run Code Online (Sandbox Code Playgroud)

一旦构建了这四个约束,就可以根据需要将它们添加到superview中.

请注意,有多种方法可以实现与上述相同的效果:

  • 您可以约束尾随空格底部空间而不是宽度和高度
  • 您可以约束中心X中心Y而不是前导和顶部空间

您也可以在视觉表示中提出相同的约束,如Peter Hosey的回答.例如,等宽度约束可能@"[mySubview(==mySuperview)]"与适当的视图字典一样.

请记住," 自动布局指南"提供了大量有关约束的信息,包括在出现问题时如何对其进行调试.


Pet*_*sey 4

在笔尖编辑器中,拖动子视图的大小,直到其与其父视图的大小相同。Xcode 将自动创建适当的宽度约束。

在代码中,我会尝试(改编自约束语法文档|-0-[mySubview]-0-|中的示例)。