Mac OS X:对视网膜显示进行运行时检查的最佳方法?

Tod*_*orf 15 macos cocoa objective-c retina-display osx-lion

鉴于在Mac OS X 10.7及更高版本上运行的Cocoa应用程序:

在运行时检查您的应用当前是否在连接了至少一个视网膜显示器的Mac上运行的最佳方法是什么?

如果检查这类事情真的是错误的,我完全欢迎有充分理由解释为什么(如果这些答案很好,我将会对这些答案进行投票).

但我还是想知道:).

您可能只需要专门检查新的Mac Book Pro"Retina"硬件(目前唯一具有视网膜显示屏的Mac),但我真的更喜欢更通用/通用/面向未来的方式来检查比这个.

理想情况下,我想知道如何检测视网膜显示器,而不是目前恰好配有视网膜显示器的特定Mac型号.

tjw*_*tjw 32

如果你真的需要这样做,请看看-[NSScreen backingScaleFactor].但是,这似乎是错误的,至少在不了解你想知道的原因的情况下.

虽然目前只有一台带有Retina显示屏的Mac,但最终可能会有支持Retina的独立显示器(并且可以在运行时连接/分离),您可以在1x模式下配置内置Retina显示屏.因此,"附有Retina显示器"这一问题的答案可以随时改变.

相反,您可能想知道是否应使用-convert*ToBacking:方法或方法以给定的比例绘制内容-[NSWindow backingScaleFactor].有关详细信息,请观看WWDC 2012会话视频"OS X上高分辨率的高级提示和技巧"(发布时,希望在未来几周内).

  • +1,OP也应该阅读[OS X高分辨率指南](https://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Introduction/Introduction.html). (4认同)
  • 这样做并没有错.网站绝对需要这样做才能为iPad和iPhone提供正确的资源,那么为什么应用程序会有所不同呢?当然,在简单的资产交换案例(即@ 2x案例)中执行自己的检查*而不是*让操作系统执行此操作是错误的.:) (3认同)
  • 网络浏览器可能需要下载2x图像,但仅当浏览器的窗口在2倍显示器上时......由于上述原因,这可能随时发生变化. (2认同)

nuc*_*ova 9

我刚碰到一个实例,我需要检测是否有任何高分辨率的屏幕,这很有用

float displayScale = 1;
    if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) {
        NSArray *screens = [NSScreen screens];
        NSUInteger screenCount = screens.count
        for (int i = 0; i < screenCount; i++) {
            float s = [screens[i] backingScaleFactor];
            if (s > displayScale)
                displayScale = s;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 你知道快速迭代,如`for(NSScreen*[NSScreen screen]中的屏幕)` 为您节省大量输入(并且在运行时更快). (4认同)

Dav*_*ong 5

那么,在iOS上你使用该UIScreen.scale属性.如果它返回2.0,那么您在具有高分辨率显示器的设备上.否则你就是低分辨率设备.

所以我想在Mac OS上你可以使用-[NSScreen backingScaleFactor]或者-[NSWindow backingScaleFactor].

  • backingScaleFactor不是类方法.因此,它应该是[[NSScreen mainScreen] backingScaleFactor]或其中一个[NSScreen屏幕]. (2认同)
  • @MichaMazaheri:有时您不需要它来绘图。就我而言,我从多个屏幕截取屏幕截图,然后您必须计算准确的像素位置。-[NSScreen backingScaleFactor] 是要走的路。 (2认同)