Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在OSX 10.8中,如何将子视图约束为与其父视图相同的大小_Macos_Cocoa_Constraints_Nsview - Fatal编程技术网

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

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

我在一个新应用程序中创建了默认的NSView窗口,该应用程序只有一个NSView。然后我创建一个新的NSViewController,它有自己的XIB和一个视图。在应用程序委托中,我做了显而易见的事情

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-|
(根据中的示例改编)。

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

  • 子视图到其superview的前导空间为零
  • 子视图到其超级视图的顶部空间为零
  • 子视图的宽度等于其超级视图的宽度
  • 子视图的高度等于其superview的宽度
  • 如果视觉约束不适合您,您可以在代码中分别构建这四个约束。使用该方法可以指定不同视图属性之间的精确关系。例如,上面的约束#1可以表示为:

    [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,而不是前导空格和顶部空格
    你也可以在视觉表现中提出同样的约束,就像彼得·霍西的回答一样。例如,使用适当的视图字典,等宽度约束可能看起来像“[mySubview(=mySuperview)]”


    请记住,有大量关于约束的信息,包括出错时如何调试约束。

    正如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大小相同?但这不是约束(即自动布局)。