Почему на iPhone требуется преобразование Quartz 2D text flip

Из документации Apple:

В iOS необходимо применить преобразование отражения к текущему графическому контексту, чтобы текст был ориентирован, как показано на рис. 16-1. [Перевернутое преобразование] включает в себя инвертирование оси Y и перемещение исходной точки в нижнюю часть экрана. В листинге 16-2 показано, как применять такие преобразования в методе drawRect: представления iOS. Затем этот метод вызывает тот же метод MyDrawText из листинга 16-1.

Почему? Это кажется совершенно дурацким.


person codecowboy    schedule 15.08.2010    source источник


Ответы (1)


Как я расширяю в этот ответ система координат Quartz 2D использует левый нижний угол как (0,0), что совпадает с системой координат окна на Mac. iPhone использует верхний левый угол как (0,0) для своего макета представления, поэтому слои, которые поддерживают UIViews, имеют свою систему координат, перевернутую вокруг оси Y.

Если вы используете расширения NSString UIKit для рисования текста на подложке для UIView, он будет ориентирован правильно, потому что это переворачивание принимается во внимание. Однако, если вы используете рисунок текста Quartz более низкого уровня, вам нужно будет сначала перевернуть систему координат относительно оси Y (так, чтобы 0,0 снова был нижним левым), чтобы правильно сориентировать вещи.

Обычные контексты Core Graphics (используемые для рисования изображений или PDF-файлов для хранения или отображения) не инвертируются, поэтому верно обратное. Обычный текст Quartz будет отображаться нормально, но для объектов, нарисованных с использованием расширений NSString UIKit, необходимо сначала инвертировать систему координат. Это вызывает много путаницы у разработчиков, чьи изображения и текст выглядят правильно при выводе на экран, но оказываются перевернутыми при сохранении на диск.

Для чего это было сделано, остается только гадать. Обе системы координат имеют свои преимущества при определенных обстоятельствах. Хотя исправить это несложно.

person Brad Larson    schedule 15.08.2010