Подтвердить что ты не робот

В чем секрет "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 "под капотом"? Я хочу понять, как это работает, поэтому я могу написать правильный код.

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

4b9b3361

Ответ 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);

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