Cocoa Autolayout和子视图的大小调整

时间:2014-02-26 13:06:42

标签: objective-c cocoa autolayout nsview

我在使用Autolayout正确调整子视图大小时遇到​​了麻烦。为了说明我的观点,我将一个简约的例子放在一起。

首先,我创建了一个新的NSViewController,并为其添加了一个子视图(在这种特殊情况下为NSTextView)并添加了Autolayout约束。

enter image description here

然后我为我的MainMenu.xib添加了一个自定义视图,并为此设置了Autolayout约束。

enter image description here

最后,我创建了一个视图控制器的实例,并将其视图放在我的自定义视图中。

#import "AppDelegate.h"
#import "MyViewController.h"

@interface AppDelegate()
@property (weak) IBOutlet NSView *customView;
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

    [self.customView addSubview:myViewController.view];
    myViewController.view.frame = self.customView.bounds;
}

@end

由于在两个xib文件中都选中了“自动调整子视图”,因此我希望在调整主窗口大小时调整NSTextView的大小。但是,它只是保持不变。

enter image description here

我在这里缺少什么?这让我困惑了几天。

谢谢, Michael Knudsen

2 个答案:

答案 0 :(得分:8)

以防万一其他人遇到同样的问题。我最终以这种方式解决了这个问题(感谢@SevenBits将我指向了这个方向)。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

    [self.customView addSubview:myViewController.view];

    myViewController.view.translatesAutoresizingMaskIntoConstraints = NO;

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:@{@"subView" : myViewController.view}];

    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:@{@"subView" : myViewController.view}];

    [self.customView addConstraints:verticalConstraints];
    [self.customView addConstraints:horizontalConstraints];
}

答案 1 :(得分:3)

您的NSTextView包含视图对其父级没有任何约束,在本例中是您的窗口。您添加的视图未调整大小,因为您的视图未通过约束“连接”到其父级。如果要以编程方式执行此操作,可能需要调查addConstraint:方法。

有关详细信息,请参阅Apple's docs