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]
.