NSScreen visibleFrame 只占主屏菜单栏区域
NSScreen visibleFrame only accounting for menu bar area on main screen
我注意到 NSScreen 的 visibleFrame
方法没有减去我的非主屏幕上的菜单栏尺寸。假设我有以下代码:
DB("Cocoa NSScreen rects:");
NSArray *screens = [NSScreen screens];
for(NSUInteger i = 0; i < [screens count]; ++i) {
NSScreen *screen = [screens objectAtIndex:i];
CGRect r = [screen visibleFrame];
const char *suffix = "";
if(screen == [NSScreen mainScreen])
suffix = " (main screen)";
DB(" %lu. (%.2f, %.2f) + (%.2f x %.2f)%s", (unsigned long)i, r.origin.x, r.origin.y, r.size.width, r.size.height, suffix);
}
我 运行 它在我的 Mac 上,每个显示器上都有一个菜单栏。然后我得到以下输出:
Cocoa NSScreen rects:
0. (4.00, 0.00) + (1276.00 x 777.00) (main screen)
1. (3200.00, 9.00) + (1200.00 x 1920.00)
2. (1280.00, 800.00) + (1920.00 x 1200.00)
菜单栏和(隐藏的)停靠栏的大小似乎已从主屏幕的可见区域中正确减去 - 但我的外接显示器上的菜单栏没有被计算在内! (假设菜单栏在每个屏幕上都是 23 像素高 - 所以我希望屏幕 1 大约为 1200x1897,屏幕 2 大约为 1920x1877。)
除了想知道屏幕有多大 - 恐怕你只需要相信我! - 我究竟做错了什么?如何获得准确的屏幕边界?
(OS X Yosemite 10.10.3)
直到程序创建一个 NSWindow
- 据我所知,这个程序从来没有 - 报告的屏幕边界似乎不准确。因此,在程序获取屏幕边界之前,它现在运行这段代码:
if(!ever_created_hack_window) {
NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0,0,100,100)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:YES
screen:nil];
[window release];
window = nil;
ever_created_hack_window = YES;
}
(ever_created_hack_window
只是一个全局的 BOOL
。)
完成后,我得到了我期望的屏幕尺寸:
0. (4.00, 0.00) + (1276.00 x 777.00) (main screen)
1. (3200.00, 9.00) + (1200.00 x 1897.00)
2. (1280.00, 800.00) + (1920.00 x 1177.00)
此外,它现在可以正确获取主屏幕中的更改。
(这可能是通过调用 UIApplicationMain
设置的东西。这个程序也不这样做。)
我注意到 NSScreen 的 visibleFrame
方法没有减去我的非主屏幕上的菜单栏尺寸。假设我有以下代码:
DB("Cocoa NSScreen rects:");
NSArray *screens = [NSScreen screens];
for(NSUInteger i = 0; i < [screens count]; ++i) {
NSScreen *screen = [screens objectAtIndex:i];
CGRect r = [screen visibleFrame];
const char *suffix = "";
if(screen == [NSScreen mainScreen])
suffix = " (main screen)";
DB(" %lu. (%.2f, %.2f) + (%.2f x %.2f)%s", (unsigned long)i, r.origin.x, r.origin.y, r.size.width, r.size.height, suffix);
}
我 运行 它在我的 Mac 上,每个显示器上都有一个菜单栏。然后我得到以下输出:
Cocoa NSScreen rects:
0. (4.00, 0.00) + (1276.00 x 777.00) (main screen)
1. (3200.00, 9.00) + (1200.00 x 1920.00)
2. (1280.00, 800.00) + (1920.00 x 1200.00)
菜单栏和(隐藏的)停靠栏的大小似乎已从主屏幕的可见区域中正确减去 - 但我的外接显示器上的菜单栏没有被计算在内! (假设菜单栏在每个屏幕上都是 23 像素高 - 所以我希望屏幕 1 大约为 1200x1897,屏幕 2 大约为 1920x1877。)
除了想知道屏幕有多大 - 恐怕你只需要相信我! - 我究竟做错了什么?如何获得准确的屏幕边界?
(OS X Yosemite 10.10.3)
直到程序创建一个 NSWindow
- 据我所知,这个程序从来没有 - 报告的屏幕边界似乎不准确。因此,在程序获取屏幕边界之前,它现在运行这段代码:
if(!ever_created_hack_window) {
NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0,0,100,100)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:YES
screen:nil];
[window release];
window = nil;
ever_created_hack_window = YES;
}
(ever_created_hack_window
只是一个全局的 BOOL
。)
完成后,我得到了我期望的屏幕尺寸:
0. (4.00, 0.00) + (1276.00 x 777.00) (main screen)
1. (3200.00, 9.00) + (1200.00 x 1897.00)
2. (1280.00, 800.00) + (1920.00 x 1177.00)
此外,它现在可以正确获取主屏幕中的更改。
(这可能是通过调用 UIApplicationMain
设置的东西。这个程序也不这样做。)