Mac OS X: Лучший способ проверить время выполнения для отображения сетчатки?

Для приложения Cocoa, которое выполняется в Mac OS X 10.7 и более поздних версиях:

Каков наилучший способ проверить во время выполнения, если ваше приложение в настоящее время работает на Mac с прикрепленным хотя бы одним дисплеем сетчатки?

Если проверка такого рода вещей действительно ошибочна, я полностью приветствую обоснованное объяснение того, почему (и я буду голосовать за такие ответы, если они хороши).

Но мне все равно хотелось бы знать:).

Похоже, вы могли бы просто сделать чек специально для нового MacBook Pro "Retina" (единственного Mac, который в настоящее время имеет сетчатый дисплей), но я бы предпочел более общий/общий/будущий способ проверить, чем это.

В идеале я хотел бы знать, как обнаружить экран сетчатки, а не конкретную модель Mac, которая в настоящее время поставляется с дисплеем сетчатки.

Ответы

Ответ 1

Если вам действительно нужно это сделать, взгляните на -[NSScreen backingScaleFactor]. Но это кажется неправильным, по крайней мере, не зная больше о том, почему вы хотите знать.

В то время как в настоящее время имеется только один Mac с дисплеем Retina, в конечном итоге могут быть автономные дисплеи, которые поддерживают Retina (и могут быть прикреплены/отсоединены во время выполнения), и вы можете настроить встроенный дисплей Retina в режиме 1x, Таким образом, ответ на вопрос "есть ли прикрепленный экран Retina" может быть изменен в любое время.

Скорее, вы можете захотеть узнать, должен ли ваш контент рисоваться с заданной шкалой с помощью методов -convert*ToBacking: или -[NSWindow backingScaleFactor]. За тонну более подробно просмотрите видеоролик сессии WWDC 2012 "Расширенные советы и рекомендации для высокого разрешения на OS X" (если вы разместите, надеюсь, в течение следующих нескольких недель).

Ответ 2

Я просто столкнулся с экземпляром, где мне нужно было определить, было ли какое-либо изображение с высоким разрешением, это сработало

float displayScale = 1;
    if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) {
        NSArray *screens = [NSScreen screens];
        for (int i = 0; i < [screens count]; i++) {
            float s = [[screens objectAtIndex:i] backingScaleFactor];
            if (s > displayScale)
                displayScale = s;
        }
    }

Ответ 3

Ну, на iOS вы используете свойство UIScreen.scale. Если он возвращает 2.0, то вы находитесь на устройстве с дисплеем с высоким разрешением. В противном случае вы используете устройство с низким разрешением.

Итак, я бы предположил, что в Mac OS вы можете использовать -[NSScreen backingScaleFactor] или -[NSWindow backingScaleFactor].