【问题标题】:How do I convert or load a UIImage into a PKDrawing?如何将 UIImage 转换或加载到 PKDrawing 中?
【发布时间】:2019-10-27 14:47:06
【问题描述】:

我希望能够将 PNG 文件加载到 PKCanvasView 中,以便能够在其中绘制和擦除部分内容。有没有办法做到这一点?

【问题讨论】:

  • 你知道怎么做吗?
  • @TomKraina 还没有,正在尝试解决它。​​
  • 还有更新吗?我也有同样的问题。我将尝试将UIImageView 拖入PKCanvas,因为这似乎可行
  • 有什么解决办法吗?我想将用户的 UIImage 添加到画布中并使用 PencilKit 进行一些编辑

标签: uikit ipados pencilkit


【解决方案1】:

首先,将你的 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 中添加了上面的代码,它就像它应该的那样工作。

【讨论】:

    【解决方案2】:

    我找不到任何有关此的官方文档,但我通过添加 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]
        }
    }
    

    【讨论】:

    • 这很聪明,但不幸的是,它仍然像背景图像一样 - 例如,您无法擦除。
    • 1.这可能(即最肯定)是一个坏主意,因为苹果可以随时更改画布视图的内部结构,在这种情况下,这将停止工作(并且在最坏的情况下会崩溃); 2. 不需要使用some UIView 作为返回类型。 subviews[UIView],所以类型是固定的,some 不做任何事情。 (另外,UIView 首先不是通用的)
    【解决方案3】:

    使用 UIImageView 并将其放在 PKCanvasView 后面,然后将 PKCanvasView opaque 设置为 false,并将颜色设置为 clear。可以画,但不能擦除。

    【讨论】:

    • 但是图像不会随着 PKCanvasView 移动或缩放。
    • 在如何使用绘图帮助保存该图像之后
    【解决方案4】:

    使用PKCanvasView的setDrawing

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

    查看 26:53 会话视频 221 的持续时间

    【讨论】:

    • 这是用于加载您保存的图纸,而不是用于 PNG。
    • 可能对 PNG 没有用,但我偶然发现了这个 SO 问题,而这个答案正是我所需要的。我正在制作一个绘图应用程序,需要弄清楚如何保存和加载绘图。
    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多