2

如何防止在缩放的纵横比图像背景之外绘制?

我需要绘制图像,类似于标记,并且根据我所看到的,您必须将图像添加到 PKCanvasView 的背景中。

在下面的 SO 中,我或多或少做了同样的事情。但是,我的设备和图像尺寸并不相同。

PencilKit 代码类似这个

struct MyCanvas: UIViewRepresentable {
    var canvasView: PKCanvasView
    let picker = PKToolPicker.init()
    
    func makeUIView(context: Context) -> PKCanvasView {
        self.canvasView.tool = PKInkingTool(.pen, color: .black, width: 15)
        self.canvasView.isOpaque = false
        self.canvasView.backgroundColor = UIColor.clear
        self.canvasView.becomeFirstResponder()

        let imageView = Image("badmintoncourt")
        imageView.contentMode = .scaleAspectFit
        imageView.clipsToBounds = true

        let subView = self.canvasView.subviews[0]
            subView.addSubview(imageView)
            subView.sendSubviewToBack(imageView)
        return canvasView
    }
    
    func updateUIView(_ uiView: PKCanvasView, context: Context) {
        picker.addObserver(canvasView)
        picker.setVisible(true, forFirstResponder: uiView)
    }
}

我的屏幕尺寸是:(1194.0, 790.0),而图像尺寸是 (1668.0, 2348.0)。尽管图像视图具有适合的纵横比,但它不会自动缩放。

为了解决这个问题,我使用了几何阅读器并传入屏幕宽度/高度,然后设置 ImageView 的框架,现在相应地缩放图像。

问题是我可以在图像边界之外绘制垂直图像,水平查看,图像左右两侧有大量空白区域。我不想在那里画画。

无论如何将可绘制画布设置为与缩放图像相同?

另一个问题是,当我更改设备方向时,绘图不会像使用 Apple 的“标记”那样粘在图像上。我读了一点,似乎锚可以工作?不确定如何使用它们。

4

2 回答 2

0

对我有用的是将 PKCanvasView 放入另一个 UIView 中,然后将 PKCanvasView 框架设置为缩放的图像尺寸,基本上是裁剪视图。

于 2021-06-11T07:03:50.760 回答
0

我知道这个问题很老,但无论如何我就是这样做的

      Image("My Image")
          .resizable()
          .scaledToFit()
          .clipped()
          .overlay {
              CanvasView(canvasView: $canvasView, onSaved: saveDrawing)
          }
          .padding(20.0)
于 2022-01-24T20:37:24.750 回答