如何将UIImage转换或加载到PKDrawing中?

11

我希望能够将PNG文件加载到PKCanvasView中进行绘制和擦除。有没有一种方法可以实现这个功能?


你想出如何做了吗? - Tom Kraina
@TomKraina 还没有,正在尝试解决它。 - rawbee
2
有更新了吗?我遇到了同样的问题。我准备尝试将 UIImageView 拖放到 PKCanvas 中,因为那种方法似乎可行。 - Tometoyou
1
有解决方案了吗?我想将用户的UIImage添加到画布中,并使用PencilKit进行一些编辑。 - Victor Sanchez
4个回答

4

我找不到任何官方文档来支持这一点,但是通过将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]
    }
}

这很聪明,但不幸的是,它仍然只像一个背景图像一样——例如你无法擦除。 - rawbee
  1. 这很可能(也就是肯定)是个坏主意,因为苹果可以随时更改画布视图的内部结构,在这种情况下,这个解决方案将无法使用(并且在最坏的情况下会崩溃);
  2. 没有必要将 some UIView 用作返回类型。subviews[UIView],所以类型是固定的,some 并没有起到任何作用。(另外,UIView 首先就不是泛型)
- lukas

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中添加了上述代码,它按照预期工作。


3

使用UIImageView将其放在PKCanvasView后面,然后将PKCanvasView的opaque设置为false,颜色设置为空。在上面进行绘画是可以的,但无法擦除。


但是图像不会随着PKCanvasView的移动或缩放而改变。 - Nestor
如何保存带有绘图的图片,请帮忙。 - mounika 582

0

2
这是用于加载您保存的绘图文件,而不是 PNG 图像。 - Lim Thye Chean
也许对于PNG文件没有用,但我偶然发现了这个SO问题,而且这个答案正是我所需要的。我正在制作一个绘图应用程序,需要弄清楚如何保存和加载绘画。 - Vlad the Impala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接