Мне нужно нарисовать контур вдоль формы изображения таким образом, чтобы оно всегда совпадало с его положением на изображении, независимо от масштаба изображения. Думайте об этом как о гибридном представлении Карт 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. Он в некоторой степени решает проблему с алиасами, но недопустимо медленно отображать.