APIs для поддержки высокого разрешения

Эта глава выделяет APIs, который Вы должны использовать и указываете на более старые методы и функции, которые Вы больше не должны использовать. Вы также сочтете информацию о APIs добавленной или измененной для поддержки высокого разрешения. Также см. надлежащую справочную документацию для каждого API, упомянутого в этой главе.

Преобразование координат

Существуют очень немногие, если таковые имеются, ситуации, для которых необходимо использовать координаты устройства непосредственно. Необходимо быть в состоянии выполнить любую задачу, касающуюся рисования геометрии при помощи APIs, описанного в этом разделе.

Во всех случаях лучше полагаться на использование одного из APIs, поддерживающего высокое разрешение вместо того, чтобы пытаться управлять значениями самостоятельно. Несмотря на то, что умножение на масштабный коэффициент (как показано ниже) могло бы привести к желаемому результату:

    NSNumber *myValue = [[NSNumber alloc] initWithDouble:value.y * scaleFactor];

предпочтительный подход должен использовать метод преобразования:

    NSNumber *myValue = [[NSNumber alloc]
                        initWithDouble:[self convertPointToBacking:value].y];

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

Преобразование в и от Представлений

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

Преобразуйте в получатель от указанного представления

Преобразуйте от получателя до указанного представления

convertPoint:fromView:

convertPoint:toView:

convertRect:fromView:

convertRect:toView:

convertSize:fromView:

convertSize:toView:

convert...:fromView: методы преобразовывают значения в систему координат получателя от системы координат представления, переданного как второй параметр. Если Вы передаете nil как представление, значения, как предполагается, находятся в системе координаты окна и преобразовываются в систему координат получателя. convert..:toView: методы выполняют обратную работу — преобразовывающие значения в системе координат получателя к системе координат представления передали в качестве параметра. Если view параметр nil, значения преобразовываются в систему координат окна получателя.

NSView также определяет centerScanRect: метод, преобразовывающий данный прямоугольник в координаты устройства, корректирует прямоугольник для расположения в центре области (пиксели), и затем преобразовывает получающийся прямоугольник назад в систему координат получателя (точки). Несмотря на то, что этот метод работает хорошо на высокое разрешение, некоторые ситуации могли бы потребовать более точного управления округляющимся поведением работы выравнивания на каждом краю прямоугольника. Если Вы нуждаетесь в высоком уровне управления, рассматриваете использование backingAlignedRect:options: (см. выравнивание прямоугольника на границах пикселей).

Для получения дополнительной информации о координатном преобразовании в представлениях, см.:

Преобразование в и от Уровней

NSView класс обеспечивает методы для преобразования между системой локальной координаты представления и внутренней системой координат уровня (для поддержанных уровнем представлений). Используйте эти методы, когда у Вас будут пользовательские деревья уровня и потребность расположить уровни соответственно в родительское представление.

Система координат уровня это отступает NSView объект не обязательно идентичен своей локальной системе координат представления. Например, Базовые Слои анимации всегда используют незеркально отраженную систему координат, тогда как NSView класс позволяет данному классу представления выбирать, зеркально отражается ли это. Для случая зеркально отраженного NSView объект, поддерживающийся уровнем, следующий счет методов преобразования на это различие.

Преобразуйте в систему координат уровня представления

Преобразуйте из системы координат уровня представления

convertPointToLayer:

convertPointFromLayer:

convertSizeToLayer:

convertSizeFromLayer:

convertRectToLayer:

convertRectFromLayer:

Преобразование в и с Экрана

NSWindow класс обеспечивает эти методы для преобразования между локальными координатами окна и экранными глобальными координатами:

Используйте их вместо осуждаемого convertBaseToScreen: и convertScreenToBase: методы.

Преобразование в и от Запоминающего устройства

Представления, окна и экраны у каждого есть их собственная система координат поддержки. Другими словами, координаты запоминающего устройства относительно объекта; они не обращаются к абсолютным позициям на экране. По умолчанию скоординируйте увеличение значений и вправо в модулях системы координат.

Отступающая система координат подходит для пиксельного выравнивания для того конкретного объекта. Всегда используйте тот же объект для круглого смещения к и от запоминающего устройства.

Каждый из следующих методов преобразовывает между системой локальной координаты объекта и выровненной пикселем системой координат, соответствующей характеристики запоминающего устройства для того объекта. В случае NSScreen класс, отступающая система координат является собственным кадровым буфером дисплея.

Для получения дополнительной информации о каждом методе см. надлежащую справочную документацию (Ссылка класса NSView, Ссылка класса NSWindow, Ссылка класса NSScreen.

Преобразуйте в координаты запоминающего устройства

Преобразуйте из координат запоминающего устройства

convertPointToBacking: (NSView)

convertPointFromBacking: (NSView)

convertSizeToBacking: (NSView)

convertSizeFromBacking: (NSView)

convertRectToBacking: (NSView)

convertRectToBacking: (NSWindow)

convertRectToBacking: (NSScreen)

convertRectFromBacking: (NSView)

convertRectFromBacking: (NSWindow)

convertRectFromBacking: (NSScreen)

Выравнивание прямоугольника на границах пикселей

Достижение непротиворечивого пиксельного выравнивания для высокого разрешения часто требует большего количества управления округлением способов поведения, чем NSView класс centerScanRect: предложения метода. NSView, NSWindow, и NSScreen классы все обеспечивают a backingAlignedRect:options: метод.

backingAlignedRect:options: метод принимает прямоугольники в локальных координатах и гарантирует, что результат выровненный на границах пикселей запоминающего устройства согласно определенным подсказкам округления, поданным options параметр. Использовать NSAlignmentOptions константы, чтобы указать, как обработать каждый край прямоугольника. Можно продвинуть ширину и высоту прямоугольника входящая, исходящая, или самая близкая граница пикселей.

Например, этот код:

NSRect rect = {0.3,0.3,10.0,10.0};
NSAlignmentOptions alignOpts = NSAlignMinXOutward | NSAlignMinYOutward |
                               NSAlignWidthOutward | NSAlignMaxYOutward ;
NSRect alignedRect = [self backingAlignedRect:rect options:alignOpts];

производит прямоугольник с этим источником и размером:

{{0, 0}, {10, 11}}

Для полного списка опций посмотрите NSAlignmentOptions в ссылке констант основы.

Получение информации масштаба

Объекты в приложении, такие как пользовательские уровни, окна, и экраны, не могли бы иметь того же разрешения. Когда необходимо узнать масштабирующуюся информацию для объекта, выбрать API, это подходяще для того объекта.

CALayer

contentsScale свойство CALayer класс определяет отображение между координатным пространством уровня (измеренный в точках) и запоминающим устройством (измеренный в пикселях). Можно изменить это значение по мере необходимости, чтобы указать к Базовой Анимации, что битовый массив отступающего уровня должен быть больше или меньшим.

Например, для предотвращения расплывчатого текста для уровня, увеличенного, когда составлено на экран используйте contentsScale свойство для указания текстового слоя побитово отображает в дважды размере уровня с включенными множественными отображениями.

NSScreen

backingScaleFactor метод NSScreen класс возвращает масштабный коэффициент, представляющий число пикселей запоминающего устройства, соответствующих каждому линейному модулю в экранном пространстве на NSScreen объект. Когда явный масштабный коэффициент необходим, Вы не должны использовать этот метод кроме редкого случая. Вместо этого используйте методы преобразования запоминающего устройства (см. Преобразование в и от Запоминающего устройства).

Обратите внимание на то, что значение, возвращенное backingScaleFactor не представляет ничто конкретное, такое как плотность пикселей или физический размер, потому что это может варьироваться на основе сконфигурированного режима отображения. Например, дисплей мог бы быть в зеркальной конфигурации, все еще масштабирующейся для высокого разрешения, приводящего к пиксельной геометрии, которая не могла бы соответствовать родное разрешение дисплея.

NSWindow

backingScaleFactor метод NSWindow класс возвращает масштабный коэффициент для определенного окна. Как с NSScreen дубликат, предпочтительно, что Вы используете методы преобразования запоминающего устройства.

CGContextRef

Предпочтительный способ получить масштабирующуюся информацию для объекта CGContext состоит в том, чтобы вызвать функцию преобразования CGContextConvertRectToDeviceSpace:

deviceRect = CGContextConvertRectToDeviceSpace(context, userRect);

Тогда можно разделиться deviceRect.size.height userRect.size.height. Это работает и на неявно масштабируемые контексты окна и на явно масштабируемые растровые контексты.

Альтернатива должна была примениться к преобразованию объект CGContext путем вызывания функции CGContextGetUserSpaceToDeviceSpaceTransform. Масштабирующаяся информация находится в a и d компоненты возвращенного преобразования. Например:

CGAffineTransform  deviceTransform =
        CGContextGetUserSpaceToDeviceSpaceTransform(myContext);
NSLog(@"x-scaling = %f y-scaling = %f", deviceTransform.a, deviceTransform.d);

Если Вы применили какое-либо дополнительное масштабирование к контексту, который будет отражен в значениях. Обратите внимание на то, что эта функция сообщает о масштабе для неявно масштабированных контекстов окна, и она не обрабатывает растровые контексты, потому что те неявно не масштабируются.

Для простых преобразований между пространством пользователя и пространством устройства, можно также использовать одну из упомянутых ниже функций преобразования (для подробных данных, см. Ссылку CGContext). Однако они преобразовывают только глобальные координаты, таким образом, необходимо выполнить дополнительные вычисления для перевода результатов в центральные представлением координаты.

Рисование изображений с NSImage и базового изображения

При рисовании изображений система должна знать об источнике и целевом разрешении для применения надлежащего масштабирования. По этой причине необходимо использовать методы, предоставляющие информацию об исходном прямоугольнике.

При работе с NSImage объекты, выберите один из этих методов, позволяющих Вам указывать исходный прямоугольник. Тот метод тогда нарисует все или часть изображения в текущей системе координат:

NSImage методы рисования, имена которых не начинаются с «получения», осуждаются (см. Осуждаемый APIs).

При работе с Базовым контекстом Изображения используйте метод drawImage:inRect:fromRect: и укажите точные границы места назначения. Если Вы создают CIContext объект с a CGContextRef, inRect: параметр находится в точках. Если Вы создаете CIContext объект с a CGLContext объект, inRect: параметр находится в пикселях. fromRect: параметр всегда находится в пиксельных размерностях.

Не использовать drawImage:atPoint:fromRect: потому что этот метод неоднозначен относительно модулей размерностей, таким образом, он не мог бы работать как ожидалось в среде с высокой разрешающей способностью.

Дополнения и Изменения для OS X v10.7.4

Дополнения к AppKit

Класс NSImage

Поведение по умолчанию для NSImage должен выбрать наименьшее представление изображения, имеющее, по крайней мере, столько же пикселей сколько целевой прямоугольник и на горизонтальных и на вертикальных осях. Значение по умолчанию работает хорошо на большинство случаев. Если Вы находите, что значение по умолчанию не работает хорошо на Ваше приложение, использует matchesOnlyOnBestFittingAxis свойство NSImage класс для корректировки выбирающего изображение поведения.

-(BOOL)matchesOnlyOnBestFittingAxis

Средства управления, как NSImage выбирает представление изображения для целевого прямоугольника. Возвращает текущую установку. Настройка по умолчанию NO. Когда установлено в YES, NSImage выбирает наименьшее представление изображения, имеющее, по крайней мере, столько же пикселей сколько целевой прямоугольник или на горизонтальной или на вертикальной оси.

setMatchesOnlyOnBestFittingAxis:

Устанавливает свойство, управляющее как NSImage выбирает представление изображения для целевого прямоугольника.

Используйте следующий для управления содержанием и масштабом для пользовательских Базовых Слоев анимации.

layerContentsForContentsScale:

Обеспечивает содержание для уровня в данном масштабе.

recommendedLayerContentsScale:

Предоставляет системе оптимальное масштабирование для использования для уровня.

Класс NSView

Для получения дополнительной информации посмотрите Динамические изменения Дескриптора в Разрешении Окна Только, Когда Вы Будете Должны и Управлять Базовым Содержанием Слоя анимации и Масштабом.

NSLayerDelegateContentsScaleUpdating

Этот протокол определяет дополнительное CALayer метод делегата для обработки изменений разрешения, позволяя Вам управлять масштабом и содержанием для уровня, размещенного в представлении.

layer:shouldInheritContentsScale:fromWindow:

Вызванный, когда разрешение изменения происходит для окна, размещающего уровень.

viewDidChangeBackingProperties

Когда свойства поддержки представления изменяются, вызывается. Реализация по умолчанию ничего не делает. Ваше приложение может обеспечить реализацию, если оно должно подкачать активы, когда изменяются свойства поддержки представления.

Класс NSWindow

Для получения дополнительной информации посмотрите Динамические изменения Дескриптора в Разрешении Окна Только, Когда Вы Будете Должны.

NSWindowDidChangeBackingPropertiesNotification

Когда свойства поддержки окна изменяются, отправляется.

windowDidChangeBackingProperties:

Когда свойства поддержки окна изменяются, вызывается. Реализация по умолчанию ничего не делает. Ваше приложение может обеспечить реализацию, если оно должно подкачать активы, когда изменяются свойства поддержки окна.

NSBackingPropertyOldColorSpaceKey

Указывает цветовое пространство окна до изменения в запоминающем устройстве.

NSBackingPropertyOldScaleFactorKey

Указывает отступающие свойства окна до изменения в запоминающем устройстве.

Дополнения к углероду

HIWindowGetBackingScaleFactor

Замены HIGetScaleFactor функция; посмотрите Получение Масштабных коэффициентов.

kHIWindowBitHighResolutionCapable

Представляет бит, устанавливающий атрибут с высокой разрешающей способностью способный.

kWindowHighResolutionCapableAttribute

Определяет окно, как являющееся способным к поддержке содержания с высокой разрешающей способностью.

Дополнения и Изменения для OS X v10.8

Класс NSImage

Используйте этот метод для внеэкранного получения. Посмотрите Использование Основанный на блоке Метод рисования для Внеэкранных Изображений.

+ (id)imageWithSize:(NSSize)size flipped:(BOOL)drawingHandlerShouldBeCalledWithFlippedContext drawingHandler:(BOOL (^)(NSRect dstRect))drawingHandler;

Обработчик получения является блоком, который может быть вызван каждый раз, когда изображение нарисовано к, и на любом потоке происходит получение. Необходимо удостовериться, что любое состояние, к которому Вы получаете доступ в блоке, сделано ориентированным на многопотоковое исполнение способом.

Код в блоке является тем же кодом, который Вы использовали бы между lockFocus и unlockFocus методы.

Quartz Display Services

Эти функции возвращают точки (не пиксели) с OS X v10.8:

size_t CGDisplayModeGetWidth(CGDisplayModeRef mode);

Возвращает ширину в точках указанного режима отображения.

size_t CGDisplayModeGetHeight(CGDisplayModeRef mode);

Возвращает высоту в точках указанного режима отображения.

Осуждаемый APIs

Если Ваш код использует какой-либо из методов или констант, перечисленных в этих разделах, необходимо заменить их, чтобы позволить приложению поддерживать высокое разрешение.

Преобразование в и от основной системы координат

Следующие методы NSView класс осуждается:

Следующие методы NSWindow класс осуждается:

Надлежащая замена зависит от преобразования, которое Вы хотите выполнить:

Получение масштабных коэффициентов

Они не совместимы с моделью с высокой разрешающей способностью в OS X:

  • userSpaceScaleFactor методы NSScreen и NSWindow классы

  • HIGetScaleFactor функция; использовать HIWindowGetBackingScaleFactor вместо этого

Создание немасштабированного окна

NSUnscaledWindowMask постоянный из NSWindow класс осуждается. Эта маска в настоящее время ничего не делает. Масштабный коэффициент для запоминающего устройства окна является динамичным и зависит от экрана, в который помещается окно. При текущем использовании этой маски для достижения точного пикселем рендеринга, необходимо заменить его методами преобразования запоминающего устройства (см. Преобразование в и от Запоминающего устройства).

Рисование изображений

NSImage методы класса compositeToPoint:... и dissolveToPoint:... воздействуйте на основную систему координат. Поведение этих методов не совместимо с высоким разрешением в OS X, потому что нет никакого способа указать исходный прямоугольник.

Вместо этого необходимо использовать один из начинающихся методов draw, такой как:

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