带有底层背景图像的可缩放 PKCanvasView

Kaz*_*awa 5 ios swift pencilkit

我喜欢PKCanvasView使用底层图像使其可滚动和缩放。在不覆盖背景图像的情况下使其可滚动和缩放似乎是可以的。但是要使用底层图像制作它,我不知道如何使其工作。

由于PKCanvasView是 的子类UIScrollView,我尝试UIView在滚动视图中放置自定义内容,然后设置一个委托来指定该视图进行缩放。但是PKCanvasView的绘图图像和内容视图在缩放时不会同步它们的位置,滚动是可以的。

+ UIView (root view)
    + PKCanvasView
        + Custom UIView (underlaying image drawing)
Run Code Online (Sandbox Code Playgroud)

然后我尝试将其PKCanvasView视为另一个中的内容视图UIScrollView,将其PKCanvasView视为不可滚动视图。然后我同步PKCanvasView的绘图和容器绘图图像之间的位置。但是,我不确定是否PKCanvasView可能不是设计为在另一个下UIScrollView,手指定位标尺的行为不稳定,通过拖动保持跳跃到另一个位置。

+ UIView (root view)
    + UIScrollView
        + Custom UIView (underlaying image drawing)
            + PKCanvasView
Run Code Online (Sandbox Code Playgroud)

据我所知,大多数PKCanvasView示例代码运行良好,无需使用底层图像进行缩放。但是一旦我设置maximumZoomScale为 2 或更多。然后它不再同步绘图和底层背景图像。

谢谢

小智 5

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

canvasView.isOpaque = false
Run Code Online (Sandbox Code Playgroud)

UIView view在您的中创建一个自定义viewDidLoad()并将其添加到您的PKCanvasView

canvasView.insertSubview(view, at: 0)
Run Code Online (Sandbox Code Playgroud)

将它插入到 0 处很重要,因此它将位于您的绘图后面。

didZoom(to scale: CGFloat)在扩展中创建一个新函数,UIView或者如果您创建了一个子类,请将其添加到那里。在那里您可以将视图调整为新的比例。

在您ViewController添加一个函数,如updateContentSizeForDrawing()

func updateContentSizeForDrawing() {
        view.frame.size = canvasView.contentSize
        view.didZoom(to: canvasView.zoomScale)
}
Run Code Online (Sandbox Code Playgroud)

我建议在你的viewWillAppear(). 要观察用户何时缩放,请将委托函数添加到您的ViewController

func scrollViewDidZoom(_ scrollView: UIScrollView) {
        updateContentSizeForDrawing()
}
Run Code Online (Sandbox Code Playgroud)