在Mac OS X中以编程方式获取屏幕尺寸

36

我可以使用以下代码返回屏幕尺寸:

- (void) getScreenResolution {

    NSArray *screenArray = [NSScreen screens];
    NSScreen *mainScreen = [NSScreen mainScreen];
    unsigned screenCount = [screenArray count];
    unsigned index  = 0;

    for (index; index < screenCount; index++)
    {
      NSScreen *screen = [screenArray objectAtIndex: index];
      NSRect screenRect = [screen visibleFrame];
      NSString *mString = ((mainScreen == screen) ? @"Main" : @"not-main");

      NSLog(@"Screen #%d (%@) Frame: %@", index, mString, NSStringFromRect(screenRect));
    }
}

输出:

屏幕 #0 (主屏幕) 框架: {{0, 4}, {1344, 814}}

有没有办法将 {1344, 814} 格式化为 1344x814


编辑:

这个方法完美地解决了问题:

- (NSString*) screenResolution {

    NSRect screenRect;
    NSArray *screenArray = [NSScreen screens];
    unsigned screenCount = [screenArray count];
    unsigned index  = 0;

    for (index; index < screenCount; index++)
    {
        NSScreen *screen = [screenArray objectAtIndex: index];
        screenRect = [screen visibleFrame];
    }

    return [NSString stringWithFormat:@"%.1fx%.1f",screenRect.size.width, screenRect.size.height];
}

2
我建议在循环中使用快速枚举而不是索引。这样做既可以使代码更快,也更容易阅读。此外,“visibleFrame”与“frame”并不相同;“visibleFrame”排除了 Dock 占用的区域或(当 Dock 隐藏时)显示 Dock 触发区域以及菜单栏。 - Peter Hosey
你的代码可能会更简单。首先是 for (NSScreen *screen in [NSScreen screens]) - Vladimir Prudnikov
有没有一种方法可以获取屏幕尺寸的实际测量值?也就是说,以厘米或英寸为单位? - adib
你需要将像素转换为任何你想要的格式。这应该很容易。只需使用上面的方法获取像素,然后进行转换即可。 - WrightsCS
6个回答

27

在Swift 4.0中,您可以获取主屏幕的屏幕尺寸:

if let screen = NSScreen.main {
    let rect = screen.frame
    let height = rect.size.height
    let width = rect.size.width
}

如果您想查找特定现有窗口的屏幕大小,则可以使用以下方法:

var window: NSWindow = ... //The Window laying on the desired screen
var screen = window.screen!
var rect = screen.frame
var height = rect.size.height
var width = rect.size.width

20

在Mac OS中查找屏幕尺寸非常简单:

NSRect e = [[NSScreen mainScreen] frame];
H = (int)e.size.height;
W = (int)e.size.width;

你为什么要将宽度和高度转换为 int 类型? - Peter Hosey
1
@PeterHosey 可能是为了表示高度和宽度都是 int 类型 :) - tomsmeding
@tomsmeding:NSRectNSPointNSSize的成员是CGPoint - Peter Hosey

15

NSLog(@"%fx%f", screenRect.size.width, screenRect.size.height);

可以将屏幕的宽度和高度打印出来。

3
很好,return [NSString stringWithFormat:@"%.0fx%.0f",screenRect.size.width, screenRect.size.height]; 完美地返回了 1024x768,谢谢。 - WrightsCS

11

编辑/更新

Swift 4

NSScreen.main?.frame         // {x 0 y 0 w 1,920 h 1,200}
NSScreen.main?.frame.width   // 1,920.0
NSScreen.main?.frame.height  // 1,200.0 

Swift 3.x

NSScreen.main()?.frame         // {x 0 y 0 w 1,920 h 1,200}
NSScreen.main()?.frame.width   // 1,920.0
NSScreen.main()?.frame.height  // 1,200.0 
Swift 2.x
NSScreen.mainScreen()?.frame         // {x 0 y 0 w 1,920 h 1,200}
NSScreen.mainScreen()?.frame.width   // 1,920.0
NSScreen.mainScreen()?.frame.height  // 1,200.0

检查您的屏幕分辨率,您可能没有使用最大分辨率。 - Leo Dabus
将其从“默认”更改为“更多空间”。 - Leo Dabus

7

对于那些正在寻找获取屏幕分辨率的方法的人:

如果你在编写一个基于窗口的应用程序,你可以通过_window.screen.frame.size来轻松获取分辨率。


2

Swift 3 solution:

NSScreen.main()!.frame


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接