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
класс определяет шесть методов, преобразовывающих прямоугольники, точки и размеры в любом направлении.
Преобразуйте в получатель от указанного представления | Преобразуйте от получателя до указанного представления |
---|---|
convert...:fromView:
методы преобразовывают значения в систему координат получателя от системы координат представления, переданного как второй параметр. Если Вы передаете nil
как представление, значения, как предполагается, находятся в системе координаты окна и преобразовываются в систему координат получателя. convert..:toView:
методы выполняют обратную работу — преобразовывающие значения в системе координат получателя к системе координат представления передали в качестве параметра. Если view
параметр nil
, значения преобразовываются в систему координат окна получателя.
NSView
также определяет centerScanRect:
метод, преобразовывающий данный прямоугольник в координаты устройства, корректирует прямоугольник для расположения в центре области (пиксели), и затем преобразовывает получающийся прямоугольник назад в систему координат получателя (точки). Несмотря на то, что этот метод работает хорошо на высокое разрешение, некоторые ситуации могли бы потребовать более точного управления округляющимся поведением работы выравнивания на каждом краю прямоугольника. Если Вы нуждаетесь в высоком уровне управления, рассматриваете использование backingAlignedRect:options:
(см. выравнивание прямоугольника на границах пикселей).
Для получения дополнительной информации о координатном преобразовании в представлениях, см.:
Преобразование в и от Уровней
NSView
класс обеспечивает методы для преобразования между системой локальной координаты представления и внутренней системой координат уровня (для поддержанных уровнем представлений). Используйте эти методы, когда у Вас будут пользовательские деревья уровня и потребность расположить уровни соответственно в родительское представление.
Система координат уровня это отступает NSView
объект не обязательно идентичен своей локальной системе координат представления. Например, Базовые Слои анимации всегда используют незеркально отраженную систему координат, тогда как NSView
класс позволяет данному классу представления выбирать, зеркально отражается ли это. Для случая зеркально отраженного NSView
объект, поддерживающийся уровнем, следующий счет методов преобразования на это различие.
Преобразуйте в систему координат уровня представления | Преобразуйте из системы координат уровня представления |
---|---|
Преобразование в и с Экрана
NSWindow
класс обеспечивает эти методы для преобразования между локальными координатами окна и экранными глобальными координатами:
Используйте их вместо осуждаемого convertBaseToScreen:
и convertScreenToBase:
методы.
Преобразование в и от Запоминающего устройства
Представления, окна и экраны у каждого есть их собственная система координат поддержки. Другими словами, координаты запоминающего устройства относительно объекта; они не обращаются к абсолютным позициям на экране. По умолчанию скоординируйте увеличение значений и вправо в модулях системы координат.
Отступающая система координат подходит для пиксельного выравнивания для того конкретного объекта. Всегда используйте тот же объект для круглого смещения к и от запоминающего устройства.
Каждый из следующих методов преобразовывает между системой локальной координаты объекта и выровненной пикселем системой координат, соответствующей характеристики запоминающего устройства для того объекта. В случае NSScreen
класс, отступающая система координат является собственным кадровым буфером дисплея.
Для получения дополнительной информации о каждом методе см. надлежащую справочную документацию (Ссылка класса NSView, Ссылка класса NSWindow, Ссылка класса 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
класс осуждается:
Надлежащая замена зависит от преобразования, которое Вы хотите выполнить:
Для преобразования между представлением и координатами уровня используйте надлежащее
convertXXXToLayer:
метод. Посмотрите Преобразование в и от Уровней.Для преобразования в координаты окна используйте надлежащее
convertXXXToView:
метод, указывая anil
представление. Посмотрите Преобразование в и от Представлений.
Получение масштабных коэффициентов
Они не совместимы с моделью с высокой разрешающей способностью в OS X:
Создание немасштабированного окна
NSUnscaledWindowMask
постоянный из NSWindow
класс осуждается. Эта маска в настоящее время ничего не делает. Масштабный коэффициент для запоминающего устройства окна является динамичным и зависит от экрана, в который помещается окно. При текущем использовании этой маски для достижения точного пикселем рендеринга, необходимо заменить его методами преобразования запоминающего устройства (см. Преобразование в и от Запоминающего устройства).
Рисование изображений
NSImage
методы класса compositeToPoint:...
и dissolveToPoint:...
воздействуйте на основную систему координат. Поведение этих методов не совместимо с высоким разрешением в OS X, потому что нет никакого способа указать исходный прямоугольник.
Вместо этого необходимо использовать один из начинающихся методов draw
, такой как:
Эти методы позволяют Вам указывать исходный прямоугольник, и они рисуют все или часть изображения в текущей системе координат.