我希望能够将 PNG 文件加载到 PKCanvasView 中,以便能够在其中绘制和擦除部分内容。有没有办法做到这一点?
4 回答
首先,将您的 UIImageView 放在 PKCanvasView 后面,然后将 PKCanvasView opaque 设置为 false,并将颜色设置为 clear。
然后在 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)
}
正如苹果所说,将您的 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 opaque 设置为 false,并将颜色设置为 clear。画在上面很好,但不能擦除。
使用 PKCanvasView 的 setDrawing
https://developer.apple.com/documentation/pencilkit/pkcanvasview/3229950-drawing
见 26:53 会议视频 221 的持续时间