Macos 在OSX 10.8中,如何将子视图约束为与其父视图相同的大小
我在一个新应用程序中创建了默认的NSView窗口,该应用程序只有一个NSView。然后我创建一个新的NSViewController,它有自己的XIB和一个视图。在应用程序委托中,我做了显而易见的事情Macos 在OSX 10.8中,如何将子视图约束为与其父视图相同的大小,macos,cocoa,constraints,nsview,Macos,Cocoa,Constraints,Nsview,我在一个新应用程序中创建了默认的NSView窗口,该应用程序只有一个NSView。然后我创建一个新的NSViewController,它有自己的XIB和一个视图。在应用程序委托中,我做了显而易见的事情 self.mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; [self.window.contentView addSubview:self.mai
self.mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
[self.window.contentView addSubview:self.mainViewController.view];
self.mainViewController.view.frame = ((NSView*)self.window.contentView).bounds;
好的,我如何以新的方式设置约束,使子视图保持其大小与窗口相同,即它是superview。它似乎不是自动工作的。两个视图的AutoResizesSubView都处于启用状态。在nib编辑器中,拖动子视图的大小,直到其大小与其超级视图相同。Xcode将自动创建适当的宽度约束
在代码中,我会尝试
|-0-[mySubview]-0-|
(根据中的示例改编)。基本上,您需要约束四件事:
[NSLayoutConstraint constraintWithItem:mySubview
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:mySuperview
attribute:NSLayoutAttributeLeading
multiplier:1.0f
constant:0.0f]
而#3可能是:
[NSLayoutConstraint constraintWithItem:mySubview
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:mySuperview
attribute:NSLayoutAttributeWidth
multiplier:1.0f
constant:0.0f]
一旦建立了这四个约束,就可以根据需要将它们添加到superview中
请注意,有多种方法可以达到上述效果:
- 您可以约束尾随空间和底部空间,而不是宽度和高度
- 您可以约束中心X和中心Y,而不是前导空格和顶部空格
请记住,有大量关于约束的信息,包括出错时如何调试约束。正如Peter所写,您应该使用可视化格式语言 但是,执行此操作时,顺序很重要:创建约束时,它引用的所有视图都必须是同一视图层次的一部分 因此,根据您的示例,代码必须是:
self.mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewContoller" bundle:nil];
NSView *containerView = self.window.contentView;
NSView *contentView = self.mainViewController.view;
[contentView setTranslatesAutoresizingMaskIntoConstraints: NO];
[containerView addSubview:contentView];
NSDictionary *viewBindings = NSDictionaryOfVariableBindings(contentView);
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:nil views:viewBindings]];
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:viewBindings]];
您可以覆盖setContentView:、contentView:、contentRectForFrameRect:,这样它们就可以处理window.frame大小的视图。如果您可以使用第三方库,只需一行即可完成这一点:
RAC(view,rcl_frame) = parentView.rcl_frameSignal;
我也遇到了同样的问题,我最终得到了这个解决方案,它与SDK 10.10一起工作。只需将新视图的
autoresizingMask
设置为与父窗口相同。只有一行代码,它就像一个符咒
self.masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
[self.window.contentView addSubview:self.masterViewController.view];
self.masterViewController.view.frame = ((NSView *)self.window.contentView).bounds;
self.masterViewController.view.autoresizingMask = ((NSView *)self.window.contentView).autoresizingMask;
您是打算在IB中还是在代码中执行此操作?我想通过将UIWindow和view保持在同一个xib文件中,可以完全避免此问题。另外,我需要使用NSWindowController而不是NSViewController(大脑中有太多的iOS),我知道我可以做到这一点,但是subivew位于不同的XIB中。我尝试了视觉约束,但它所做的只是约束父对象不小于子对象。认为这一定是错误的约束语法(到目前为止,这东西相当混乱)@ahwulf:约束必须能够引用两个对象,因此如果对象位于不同的nib中,则无法在nib中创建约束,因为您将在哪个nib中创建它?是的,它需要在代码中,但到目前为止还不清楚它应该是什么样子。我已经通过将所有内容保存在一个xib文件中解决了这个问题,但我喜欢这个答案。在我找到时间亲自尝试之前,我无法标记它。NSWindow的重写方法如何帮助约束视图始终与其superview大小相同?但这不是约束(即自动布局)。