具有自定义分辨率的OSX全屏(Kiosk)应用程序

时间:2016-02-01 23:41:08

标签: objective-c macos cocoa metal

我有一个OS X Metal应用程序,我希望以非原生分辨率全屏运行,例如我的原始分辨率是1920x1080,我想以1024x768全屏显示应用程序。 (除非我无法使用特定于OpenGL的NSView函数,否则我不相信使用Metal绘制事物会影响这个问题。)

我的渲染器使用硬编码大小为1024x768的后缓冲区。

当我使用bounds = 1024x768创建窗口时,我会看到一个全屏窗口,但我的内容被绘制为居中并且不会拉伸以填满整个屏幕。

当我使用bounds = 1920x1080创建窗口时,我会看到一个全屏窗口,但我的内容会在左上角绘制并且缩放不正确(因为两个分辨率之间的比率不匹配)。

使用[NSView - enterFullScreenMode:withOptions:]产生了相同的结果。设置[NSView autoresizingMask]也没有改变任何内容。

理想情况下,我希望窗口的大小与屏幕一样,并且可以拉伸低分辨率后台缓冲区以填充整个窗口。我错过了什么才能让我这样做?

NSResponder <NSApplicationDelegate>的相关应用初始化:

// Create the window
self.Window = [NSWindow alloc];
[self.Window initWithContentRect:bounds
                       styleMask:NSBorderlessWindowMask
                         backing:NSBackingStoreBuffered
                           defer:YES];

// Create the view
self.View = [NSView alloc];
[self.View initWithFrame:bounds];
[self.View setWantsLayer:YES];    // The generated layer is CAMetalLayer

// Associate the view with the window
[self.Window setContentView:self.View];

// Misc
[self.Window makeKeyAndOrderFront:self.Window];
[self.Window setAcceptsMouseMovedEvents:YES];
[self.Window setHidesOnDeactivate:YES];

// Fullscreen
[self.Window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
[self.Window toggleFullScreen:nil];
[self.Window makeFirstResponder:self.View];

感谢。

1 个答案:

答案 0 :(得分:2)

支持视图的图层被约束为使其框架等于该视图的边界。默认情况下,drawableSize的{​​{1}}等于其内容比例的界限。但是,您可以通过明确设置图层的CAMetalLayer

将其设置为您想要的任何尺寸