从xib自动调整子视图

时间:2013-04-15 01:24:43

标签: objective-c macos cocoa

在我的应用程序中,window.contentView大小为700 * 500,并且在我将view1添加为window.contentView的子视图后,我从xib初始化了一个名为view1的视图,其大小为480 * 300。需要自动将view1调整为700 * 500,我已设置autoresizingMask但它不起作用。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    self.rootViewController = [[TrendRootViewController alloc] initWithNibName:@"TrendRootViewController" bundle:[NSBundle mainBundle]];
    NSView *view1 =  self.rootViewController.view;
    [self.contentView addSubview:view1];
    NSLog(@"view1 frame %@",NSStringFromRect(view1.frame));
}

view1 xib enter image description here

我的应用:(红色视图是view1) enter image description here

很奇怪view1的框架是“view1 frame {{0,0},{480,300}}”,但如下图所示,view1不在左上角位置。

2 个答案:

答案 0 :(得分:0)

您可以通过更改IB中调整大小框正上方的原点框中的箭头位置来完成此操作。只需点击原点框的左上角,您的视图就会显示在左上角。

答案 1 :(得分:0)

  

“view1的帧是”view1 frame {{0,0},{480,这很奇怪   300}}“,但如下图所示,view1不在左上角位置。”

OS X不是iOS,AppKit不是UIKit。

iOS中基于UIKit的视图的默认坐标系是左上角(ULO),而OS X中基于AppKit的视图的默认坐标系是左下角(LLO)。

因此,红色视图的框架为{{0, 0}, {480, 300}}是有意义的,因为它的原点位于{0, 0},这是窗口contentView的左下角。

与iOS中的某些UIViewController不同,NSViewController不会自动调整其视图的大小以适应窗口的大小。如果您希望视图的框架与窗口的框架匹配,则可以使用几种不同的选项。

一个选项是在将视图作为子视图添加到窗口contentView之前自己设置视图的框架:

NSView *redView = self.rootViewController.view; // force view to load
[redView setFrame:NSMakeRect(0.0, 0.0, NSWidth(self.window.frame),
                                       NSHeight(self.window.frame))];
[self.window.contentView addSubview:redView];

或者,在Interface Builder中,您可以向窗口添加与窗口内容视图大小相同的NSBox。在IB中,将框的标题位置设置为None,将框类型设置为Custom,将边框类型设置为None。将其“弹簧和支柱”(自动调整遮罩)设置为与view1.xib中的视图相同(这样当您调整窗口大小时,框会随之调整大小)。然后为该框创建IBOutlet,而不是将视图控制器的view作为子视图添加到窗口的contentView,而是调用NSBox的{​​{1}}和传递视图控制器的视图:

setContentView:

正如[self.box setContentView:self.rootViewController.view]; 的{​​{3}}方法中所述,您传递的视图“...已调整大小以适应框的当前内容区域,并且该框标记为重新显示。”换句话说,该框会自动处理将视图大小调整为适合您的大小。