与子视图共享 PKCanvasView 作为图像

Posted

技术标签:

【中文标题】与子视图共享 PKCanvasView 作为图像【英文标题】:Sharing PKCanvasView with a subview as an Image 【发布时间】:2020-06-08 03:38:28 【问题描述】:

我有一个PKCanvasView,其子视图为UIImageView

我想以UIImage 的身份分享这个观点。这将是 UIImageView 及其上方的 PKCanvasView.drawing

这是我获得绘图部分的方式。我只是不确定如何获得UIImageView

private func image(from canvas: PKCanvasView) -> UIImage 
    let drawing = canvas.drawing
    let visibleRect = canvas.bounds
    let image = drawing.image(from: visibleRect, scale: UIScreen.main.scale)
    return image

更新:

这是我目前正在尝试的:

let format = UIGraphicsImageRendererFormat.default()
format.opaque = false
let visibleRect = CGRect(x: 0, y: 0, width: self.imageView.frame.size.width, height: self.imageView.frame.size.height)

let image = UIGraphicsImageRenderer(size: self.imageView.frame.size, format: format).image  context in
    imageView.image?.draw(in: visibleRect, blendMode: .normal, alpha: 1.0)
    canvasView.drawing.image(from: visibleRect, scale: UIScreen.main.scale).draw(at: .zero)

我面临的问题是我的图像被从上到下拉伸。有些图像比其他图像多。

【问题讨论】:

【参考方案1】:

您需要创建一个新的图形上下文,将图像绘制到其中,然后在其上绘制图形。您的代码应如下所示:

let format = UIGraphicsImageRendererFormat.default()
format.opaque = false
let image = UIGraphicsImageRenderer(size: imageView.frame.size, format: format).image  context in
    imageView.image?.draw(at: .zero)
    canvas.drawing.image(from: imageView.frame, scale: UIScreen.main.scale).draw(at: .zero)

【讨论】:

谢谢利奥。这很接近。我面临的问题是图像比预期的大,所以图像和它上面的绘图/着色不对齐。 @LukeIrvin 您应该根据图像大小创建画布大小 当然,肯定会。只是想让我的形象在出口时看起来正确。然后我可以更新画布大小以匹配图像大小。 您必须先设置画布。设置 CanvasViewControler 时 canvasView.frame = view.framecanvasView.contentSize = imageView.frame.size

以上是关于与子视图共享 PKCanvasView 作为图像的主要内容,如果未能解决你的问题,请参考以下文章

我可以以某种方式与子进程共享一个异步队列吗?

如何与子线程共享变量?

UIView 动画与子视图同步

子视图与子视图控制器 z 位置

跨多个视图控制器共享背景图像

UINavigationController 与子视图控制器的奇怪行为