我希望能够将PNG文件加载到PKCanvasView中进行绘制和擦除。有没有一种方法可以实现这个功能?
我找不到任何官方文档来支持这一点,但是通过将UIImageView作为PKCanvasView的第一个子视图的子视图添加,我使其工作。 设置.maximumZoomScale=1和.minimumZoomScale=5后,缩放也正常工作。
请注意,由于苹果可能会更改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]
}
}
some UIView
用作返回类型。subviews
是 [UIView]
,所以类型是固定的,some
并没有起到任何作用。(另外,UIView
首先就不是泛型)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后面,然后将PKCanvasView的opaque设置为false,颜色设置为空。在上面进行绘画是可以的,但无法擦除。
https://developer.apple.com/documentation/pencilkit/pkcanvasview/3229950-drawing
请查看第221个会话视频的26:53时长
UIImageView
拖放到PKCanvas
中,因为那种方法似乎可行。 - Tometoyou