В чем секрет "contentScaleFactor" UIView при использовании с CATiledLayer?
Привет,
Я работаю над приложением, вдохновленным примером "ZoomingPDFViewer", который поставляется с iOS SDK. В какой-то момент я нашел следующий бит кода:
// to handle the interaction between CATiledLayer and high resolution
// screens, we need to manually set the tiling view
// contentScaleFactor to 1.0. (If we omitted this, it would be 2.0
// on high resolution screens, which would cause the CATiledLayer
// to ask us for tiles of the wrong scales.)
pageContentView.contentScaleFactor = 1.0;
Я попытался узнать больше о contentScaleFactor
и о том, что он делает. Прочитав всю документацию Apple, которая упомянула об этом, я искал Google и не нашел определенного ответа на то, что она на самом деле делает.
Вот несколько вещей, которые мне интересны:
-
Кажется, что contentScaleFactor
оказывает какое-то влияние на графический контекст при рисовании содержимого UIView/CALayer. Это, по-видимому, актуально для дисплеев с высоким разрешением (например, Retina Display). Какое влияние имеет эффект contentScaleFactor
и на что?
-
При использовании UIScrollView
и настройке его для увеличения, скажем, моего contentView; все подпункты contentView также масштабируются. Как это работает? Какие свойства UIScrollView
изменяются, чтобы сделать даже видеоплееры размытыми и масштабироваться?
TL; DR: Как работает функция масштабирования UIScrollView "под капотом"? Я хочу понять, как это работает, поэтому я могу написать правильный код.
Любые подсказки и объяснения высоко ценятся!:)
Ответы
Ответ 1
Координаты выражаются в точках, а не в пикселях. contentScaleFactor
определяет отношение между точкой и пикселями: если оно равно 1, точки и пиксели одинаковы, но если оно равно 2 (например, показания сетчатки), это означает, что каждая точка имеет два пикселя.
В обычном чертеже работа с точками означает, что вам не нужно беспокоиться о разрешениях: в iphone 3 (scaleFactor 1) и iphone4 (scaleFactor 2 и 2x resolution) вы можете использовать те же координаты и код рисования. Однако, если вы рисуете изображение (непосредственно, как текстуру...) и просто используя обычные координаты (точки), вы не можете доверять тому, что пиксельная точка-точка равна 1 к 1. Если вы это сделаете, то каждый пиксель изображение будет соответствовать 1 точке, но 4 пикселя, если scaleFactor равен 2 (2 в направлении x, 2 в y), чтобы изображения могли немного размываться
Работая с CATiledLayer
, вы можете получить неожиданные результаты с помощью scalefactor 2. Я предполагаю, что наличие UIView
a contentScaleFactor==2
и слоя a contentScale==2
путают систему и иногда умножают масштаб. Возможно, что-то подобное происходит с Scrollview.
Надеюсь, это немного разъяснит это.
Ответ 2
У Apple есть раздел об этом на странице "Поддержка экранов высокого разрешения" в документах iOS dev.
На странице написано:
Обновление пользовательского кода чертежа
Когда вы делаете какой-либо пользовательский чертеж в своем приложении, большую часть времени вам не нужно заботиться о разрешении основных экран. Собственные технологии рисования автоматически гарантируют, что координаты, которые вы задаете в логической карте координат правильно к пикселам на нижнем экране. Иногда, однако, вам может понадобиться чтобы узнать, каков текущий масштабный коэффициент, чтобы правильно. Для этих ситуаций UIKit, Core Animation и другие системные рамки предоставляют вам необходимую помощь правильно.
Создание изображений растрового изображения с высоким разрешением Programmatically Если вы в настоящее время используется функция UIGraphicsBeginImageContext для создания растровые изображения, вы можете настроить свой код, чтобы принять масштабные факторы в Счет. Функция UIGraphicsBeginImageContext всегда создает изображений с масштабным коэффициентом 1,0. Если базовое устройство имеет экран с высоким разрешением, изображение, созданное с помощью этой функции, может не выглядят гладкими при визуализации. Чтобы создать изображение с масштабным коэффициентом кроме 1.0, используйте UIGraphicsBeginImageContextWithOptions вместо. Процесс использования этой функции такой же, как для Функция UIGraphicsBeginImageContext:
- Вызов UIGraphicsBeginImageContextWithOptions для создания растрового изображения контекст (с соответствующим масштабным коэффициентом) и нажмите на графический стек.
- Используйте подпрограммы UIKit или Core Graphics для рисования содержимого изображение.
- Вызов UIGraphicsGetImageFromCurrentImageContext для получения растровых изображений содержание.
- Вызвать UIGraphicsEndImageContext, чтобы вывести контекст из стека.
Например, следующий фрагмент кода создает растровое изображение размером 200 x 200 пикселей. (Число пикселей равно определяется путем умножения размера изображения по шкале фактор.)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);
Смотрите здесь: Поддержка экранов с высоким разрешением