масштабируемый PKCanvasView с фоновым изображением - PullRequest
3 голосов
/ 09 мая 2020

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

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

+ UIView (root view)
    + PKCanvasView
        + Custom UIView (underlaying image drawing)

Затем я попробовал PKCanvasView как просто представление содержимого внутри другого UIScrollView, рассматривать PKCanvasView как просмотр без прокрутки. Затем я синхронизирую позиции между рисунком PKCanvasView и изображением чертежа контейнера. Тем не менее, я не уверен, может ли PKCanvasView не быть предназначен для нахождения под другим UIScrollView, поведение позиционирования линейки пальцем нестабильно, постоянно перемещается с места на место путем перетаскивания.

+ UIView (root view)
    + UIScrollView
        + Custom UIView (underlaying image drawing)
            + PKCanvasView

Насколько мне известно, большая часть кода примера PKCanvasView работает хорошо без увеличения изображения с нижележащим изображением. Но однажды я установил maximumZoomScale на 2 или больше. Тогда он больше не синхронизирует рисунки и фоновое изображение.

Спасибо

Ответы [ 2 ]

2 голосов
/ 27 июня 2020

Настройте свой PKCanvasView в Main.storyboard и свяжите его со своим ViewController (@IBOutlet weak var canvasView: PKCanvasView!) и настройте следующее свойство (в вашем Main.storyboard или viewDidLoad() для ViewController):

canvasView.isOpaque = false

Создайте также пользовательский UIView view в своем viewDidLoad() и добавьте его в свой PKCanvasView:

canvasView.insertSubview(view, at: 0)

Важно, чтобы вы вставляли его в 0, чтобы он был за вашими рисунками.

Создайте новую функцию didZoom(to scale: CGFloat) в Расширении UIView или, если вы создали подкласс, добавьте его туда. Здесь вы можете настроить свой вид на новый масштаб.

В свой ViewController добавьте такую ​​функцию, как updateContentSizeForDrawing():

func updateContentSizeForDrawing() {
        view.frame.size = canvasView.contentSize
        view.didZoom(to: canvasView.zoomScale)
}

Я рекомендую вызывать эту функцию в конце вашего viewWillAppear(). Чтобы наблюдать, когда пользователь увеличивает масштаб, добавьте функцию делегата в свой ViewController:

func scrollViewDidZoom(_ scrollView: UIScrollView) {
        updateContentSizeForDrawing()
}
0 голосов
/ 10 мая 2020

Я снова погуглил и нашел ключ к решению этой проблемы. Так как я не могу читать по-китайски, но могу прочитать фрагмент кода.

https://stackoom.com/question/3pNGe/如何将UIImage转换或加载到PKDrawing中

Я экспериментировал с этим некоторое время, и я публикую проект в GitHub.

https://github.com/codelynx/PKCanvasViewTester

...