以编程方式创建窗口不会显示为正确的大小

时间:2014-03-31 16:20:18

标签: objective-c macos cocoa

这是我在applicationDidFinishLaunching函数中的代码,

    // Create window
NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 400, 300)
    styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)
                                                      backing:NSBackingStoreBuffered defer:NO];

//Create gl view
NSRect frame = [window contentRectForFrameRect:[window frame]];
MyOpenGLView *glView = [[MyOpenGLView alloc] initWithFrame:frame];

[window setContentView:glView];
[window makeFirstResponder:glView];

// Show up
[window makeKeyAndOrderFront:self];

应用程序构建并运行。但是当它运行时,窗口似乎是全屏的。换句话说,我在左上角得到了应用程序的名称,屏幕上没有其他内容发生变化。它像我的屏幕大小的空窗口。为什么会发生这种情况,我该如何解决?

附加信息:MyOpenGLView类中的initWithFrame函数,

self = [super initWithFrame:frameRect];
[self myInit];
return self;

1 个答案:

答案 0 :(得分:0)

我猜你正在使用自动参考计数(ARC)而不是手动参考计数。要查看,这是您的代码:

- (void)applicationDidFinishLaunching:(NSNotification *)notification {

    NSWindow *window = [[NSWindow alloc] initWithContentRect:
    NSMakeRect(0, 0, 400, 300) styleMask:(NSTitledWindowMask | NSClosableWindowMask |
 NSMiniaturizableWindowMask | NSResizableWindowMask)
                     backing:NSBackingStoreBuffered defer:NO];

    //Create gl view
    NSRect frame = [window contentRectForFrameRect:[window frame]];
    MyOpenGLView *glView = [[MyOpenGLView alloc] initWithFrame:frame];

    [window setContentView:glView];
    [window makeFirstResponder:glView];

    // Show up
    [window makeKeyAndOrderFront:self];

}

在ARC下,您在此方法中创建的NSWindow只会持续与方法一样长。换句话说,它将被创建,显示为瞬间(如果有的话),然后立即被释放并从屏幕上删除。为了使其持久化,您应该将其定义为实例变量。例如:

MDAppController.h:

  @interface MDAppController : NSObject

  @property (nonatomic, strong) NSWindow *window;

  @end

MDAppController.m:

- (void)applicationDidFinishLaunching:(NSNotification *)notification {

     self.window = [[NSWindow alloc] initWithContentRect:
                      NSMakeRect(0, 0, 400, 300)
                   styleMask:(NSTitledWindowMask | NSClosableWindowMask |
            NSMiniaturizableWindowMask | NSResizableWindowMask)
                     backing:NSBackingStoreBuffered defer:NO];
   // or 
   // _window = ....

   // ....
   // Show up
   [self.window makeKeyAndOrderFront:self];
   // or 
   // [_window makeKeyAndOrderFront:self];
}

在这里,您将实例变量window设置为您创建的NSWindow,因为该ivar定义为strong,它将在该方法返回后保留。