我喜欢使PKCanvasView可以与底层图像一起滚动和缩放。使其可以滚动和缩放而不显示背景图像似乎是可以的。但是要制作带有底图的图片,我不知道如何使它生效。

由于PKCanvasViewUIScrollView的子类,因此我尝试将自定义内容UIView放置在滚动视图中,然后设置一个委托以指定要缩放的视图。但是PKCanvasView的绘图图像和内容视图在缩放时不会同步其位置,滚动也可以。

+ UIView (root view)
    + PKCanvasView
        + Custom UIView (underlaying image drawing)

然后,我尝试将PKCanvasView视为另一个UIScrollView中的内容视图,将PKCanvasView视为不可滚动的视图。然后,我将PKCanvasView的图形和容器的图形之间的位置同步。但是,我不确定PKCanvasView是否可能不适合在另一个UIScrollView下使用,用手指定位标尺的行为不稳定,并通过拖动来保持跳跃的位置。
+ UIView (root view)
    + UIScrollView
        + Custom UIView (underlaying image drawing)
            + PKCanvasView

据我所知,大多数PKCanvasView示例代码在不缩放底层图像的情况下都能很好地工作。但是一旦我将maximumZoomScale设置为2或更多。然后,它不再同步图形和背景图像。

谢谢

最佳答案

PKCanvasView中设置Main.storyboard并将其链接到ViewController(@IBOutlet weak var canvasView: PKCanvasView!),并调整以下属性(在Main.storyboardviewDidLoad()中为ViewController):

canvasView.isOpaque = false
在您的UIView view中也创建一个自定义viewDidLoad()并将其添加到您的PKCanvasView中:
canvasView.insertSubview(view, at: 0)
重要的是将其插入0,这样它将位于图形的后面。
didZoom(to scale: CGFloat)的扩展名中创建一个新的函数UIView,或者如果您创建了一个子类,则在其中添加它。在那里,您可以将视图调整为新的比例。
ViewController中添加类似updateContentSizeForDrawing()的函数:
func updateContentSizeForDrawing() {
        view.frame.size = canvasView.contentSize
        view.didZoom(to: canvasView.zoomScale)
}
我建议在viewWillAppear()的末尾调用此函数。要观察用户何时缩放,请将委托函数添加到ViewController中:
func scrollViewDidZoom(_ scrollView: UIScrollView) {
        updateContentSizeForDrawing()
}

10-04 17:09