В чем секрет «contentScaleFactor» UIView при использовании с CATiledLayer? - PullRequest
17 голосов
/ 11 марта 2011

Привет,

Я работаю над приложением, вдохновленным примером ZoomingPDFViewer, который поставляется с iOS SDK. В какой-то момент я нашел следующий бит кода:

// to handle the interaction between CATiledLayer and high resolution
// screens, we need to manually set the tiling view's 
// 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 и так и не нашел однозначного ответа на то, что он на самом деле делает.

Вот несколько вещей, которые мне интересны:

  1. Кажется, что contentScaleFactor оказывает некоторый эффект на графический контекст, когда рисуется содержимое UIView / CALayer. Это, кажется, относится к дисплеям с высоким разрешением (таким как Retina Display). Какой эффект действительно имеет contentScaleFactor и на что?

  2. При использовании UIScrollView и настройке его на увеличение, скажем, мой contentView ; все подпредставления contentView также масштабируются. Как это работает? Какие свойства UIScrollView изменяются, чтобы даже видеоплееры становились размытыми и масштабировались?

TL; DR: Как функция масштабирования в UIScrollView работает "под капотом"? Я хочу понять, как это работает, чтобы я мог написать правильный код.

Любые намеки и объяснения высоко ценятся! :)

Ответы [ 2 ]

7 голосов
/ 20 августа 2011

Координаты выражены в точках, а не в пикселях. contentScaleFactor определяет отношение между точкой и пикселями: если оно равно 1, точки и пиксели одинаковы, но если оно равно 2 (как на сетчатке), это означает, что каждая точка имеет два пикселя.

При обычном рисовании работа с точками означает, что вам не нужно беспокоиться о разрешениях: в iphone 3 (scaleFactor 1) и iphone4 (scaleFactor 2 и 2x разрешение) вы можете использовать те же координаты и код рисования. Однако, если вы рисуете изображение (непосредственно, как текстуру ...) и просто используете нормальные координаты (точки), вы не можете доверять тому, что карта пиксель-точка имеет значение 1 к 1. Если вы это делаете, то каждый пиксель изображение будет соответствовать 1 точке, но 4 пикселям, если scaleFactor равен 2 (2 в направлении x, 2 в y), поэтому изображения могут стать немного размытыми

Работая с CATiledLayer, вы можете получить некоторые неожиданные результаты с помощью коэффициента масштабирования 2. Я предполагаю, что наличие UIView a contentScaleFactor==2 и слоя a contentScale==2 запутывает систему и иногда умножает масштаб. Может быть, что-то подобное происходит со Scrollview.

Надеюсь, это немного прояснит

2 голосов
/ 25 октября 2011

У Apple есть раздел на эту тему на странице «Поддержка экранов с высоким разрешением» в документации по iOS для разработчиков.

На странице написано:

Обновление пользовательских настроекКод для рисования

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

Создание растровых изображений с высоким разрешением программно Если вы в настоящее время используете функцию UIGraphicsBeginImageContext для создания растровых изображений, вы можетехотите изменить свой код, чтобы учесть масштабные коэффициенты.Функция UIGraphicsBeginImageContext всегда создает изображения с масштабным коэффициентом 1,0.Если базовое устройство имеет экран с высоким разрешением, изображение, созданное с помощью этой функции, может не выглядеть гладким при визуализации.Чтобы создать изображение с масштабным коэффициентом, отличным от 1,0, используйте взамен UIGraphicsBeginImageContextWithOptions.Процесс использования этой функции такой же, как и для функции UIGraphicsBeginImageContext:

  1. Вызовите UIGraphicsBeginImageContextWithOptions для создания контекста растрового изображения (с соответствующим масштабным коэффициентом) и вставьте его в графический стек.
  2. Используйте процедуры UIKit или Core Graphics для рисования содержимого изображения.
  3. Вызовите UIGraphicsGetImageFromCurrentImageContext для получения содержимого растрового изображения.
  4. Вызовите UIGraphicsEndImageContext для извлечения контекста из стека.

Например, следующий фрагмент кода создает растровое изображение размером 200 x 200 пикселей.(Количество пикселей определяется путем умножения размера изображения на коэффициент масштабирования.)

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);

См. Здесь: Поддержка экранов высокого разрешения

...