Наложение 2D-путей на UIImage без масштабирования артефактов - PullRequest
0 голосов
/ 03 октября 2009

Мне нужно нарисовать контур вдоль формы изображения таким образом, чтобы оно всегда совпадало с его положением на изображении, независимо от масштаба изображения. Думайте об этом как о гибридном представлении Карт Google, где названия улиц и дорог накладываются на аэрофотоснимки.

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

Мне удается как-то заставить это работать, используя этот подход:

-Создайте пользовательский UIView с именем CanvasView, который обрабатывает взаимодействие с касаниями и доставляет значения масштабирования, поворота и перевода в UIImageView или PathsView (см. Ниже) в зависимости от флага: deliveryToImageOrPaths.

-Создать UIImageView, содержащий базовое изображение. Это установлено как потомки CanvasView

-Создайте пользовательский UIView с именем PathsView, который отслеживает геометрию 2D-контуров и рисует сам с помощью собственного drawRect. Это устанавливается как дочерний элемент UIImageView.

Итак, иерархия: CanvasView -> UIImageView -> PathsView

Таким образом, когда в поле receiveToImageOrPaths задано значение YES, жесты пальцев преобразуют как UIImageView, так и его дочерний PathsView. Если в поле DeliveryToImageOrPaths установлено значение NO, жесты влияют только на PathsView, изменяя его геометрию. Пока все хорошо.

ВОПРОС: У меня проблема в том, что при масштабировании базового UIImageView (через его свойство .transform) PathsView масштабируется с использованием артефактов с псевдонимами. drawRect все еще вызывается в PathsView, но я предполагаю, что он выполняет рисование с использованием исходного размера буфера и затем интерполирует.

Как я могу решить эту проблему? Есть ли лучшие способы реализовать эти функции?

PS: я попытался изменить класс слоя PathsView на CATiledLayer с помощью levelsOfDetailBias 4 и levelsOfDetail 4. Он в некоторой степени решает проблему с алиасами, но недопустимо медленно отображать.

Ответы [ 2 ]

0 голосов
/ 30 октября 2009

Если вы нацелены на iPhone OS 3.0+, вы можете использовать CAShapeLayer для вашего пути. Вы назначаете CGPathRef для слоя, и он будет обрабатывать все рисование и масштабирование для вас. Вы просто устанавливаете преобразование слоя.

0 голосов
/ 03 октября 2009

Если вы удерживаете значения пути по мере их отрисовки, вы можете зафиксировать масштабирование% базового изображения, затем переместить значения пути и перерисовать их в методе drawRect в PathsView.

Это потребовало бы немного математики (в основном по линиям проекций карты), но вместо масштабирования растровых изображений и получения артефактов вы будете масштабировать расстояния до точек и перерисовывать их с помощью векторов, что сделает его сглаженным при любом разрешении (особенно если Вы соединяете точки с Безье вместо пикселей или линий).

Если вы наносите краску вдоль путей, когда пользователь рисует их, и выбрасываете данные точек, то единственное решение состоит в том, чтобы сделать растровое сглаживание, что, по сути, и делает CATiledLayer для вас и, как вы обнаружили, , может быть медленным.

...