Как мне конвертировать или загрузить 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