Как мне конвертировать или загрузить UIImage в PKDrawing?

Я хотел бы иметь возможность загружать файл PNG в PKCanvasView, чтобы иметь возможность рисовать и стирать его части. Есть ли способ сделать это?

2 ответа

Сначала поместите свой UIImageView за PKCanvasView, затем установите для PKCanvasView непрозрачность значение false, а цвет - очистить.

Затем в PKCanvasViewDelegate:

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return YOUR_IMAGEVIEW
}

func scrollViewDidZoom(_ scrollView: UIScrollView) {

    let offsetX: CGFloat = max((scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5, 0.0)
    let offsetY: CGFloat = max((scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5, 0.0)
    YOUR_IMAGEVIEW.frame.size = CGSize(width: self.view.bounds.width * scrollView.zoomScale, height: self.view.bounds.height * scrollView.zoomScale)
    YOUR_IMAGEVIEW.center = CGPoint(x: scrollView.contentSize.width * 0.5 + offsetX, y: scrollView.contentSize.height * 0.5 + offsetY)

}

Как сказал Apple, помещения вашего imageView в viewForZooming достаточно, но это не работает. Итак, я добавил приведенные выше коды в scrollViewDidZoom, и он работает так, как должен.

Я не могу найти никакой официальной документации по этому поводу, но я заставляю ее работать, добавляя UIImageView в качестве подпредставления первой подпредставления PKCanvasView. Масштабирование также отлично работает, если установить.maximumZoomScale=1 и.minimumZoomScale=5.

Но обратите внимание, что это может не сработать в будущем, поскольку Apple может изменить свою реализацию PKCanvasView.

Вот пример кода для SwiftUI

    func makeUIView(context: Context) -> UIView {
        let view = PKCanvasView()
        ...
        ...
        view.backgroundColor = .clear
        view.isOpaque = false
        view.maximumZoomScale = 5
        view.minimumZoomScale = 1

        let imageView = UIImageView(image: UIImage(named: "NameOfImage"))
        let contentView = Tool.getContentViewFromPkCanvasView(view)
        contentView.addSubview(imageView)
        contentView.sendSubviewToBack(imageView)
        return view
    }
class Tool{
    static func getContentViewFromPkCanvasView(_ view: UIView) -> some UIView {
        return view.subviews[0]
    }
}

Используйте UIImageView и поместите его позади PKCanvasView, затем установите непрозрачный PKCanvasView в false и очистите цвет. Рисовать на нем нормально, но стереть невозможно.

Используйте setDrawing PKCanvasView

https://developer.apple.com/documentation/pencilkit/pkcanvasview/3229950-drawing

Смотрите 26:53 продолжительность сеанса видео 221

Другие вопросы по тегам