如何在 UIView 中定位 CAShapeLayer

How to position CAShapeLayer in a UIView

我在 Stack overflow 上看到了很多答案,但是 none 帮助了我。 我创建了一个可以绘制的 DrawView。我创建了一个 UIBezierPath 的实例用于绘图。 我想在一个小视图(图像上的红色视图)上传输我的绘图。我就是这么做的:

// This function is called when the user has finished to draw.

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    let shapeLayer = CAShapeLayer()

    //The CAShapeLayer has the same path of the drawing (currentPath is the instance of UIBezierPath).
    shapeLayer.path = currentPath?.cgPath
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.lineWidth = 10.0

    //drawingView is the red view where I want to see my drawing in the center. This line of code doesn't work like I expect because the drawing doesn't appear in the center of the view.
    shapeLayer.position = CGPoint(x: drawingView.frame.midX, y: drawingView.frame.midY)

    //I add the shapeLayer to the drawingView.
    drawingView.layer.addSublayer(shapeLayer)
}

这是应用程序的图片:

有什么提示吗?谢谢。

问题出在这一行:

shapeLayer.position = CGPoint(x: drawingView.frame.midX, y: drawingView.frame.midY)

你在任何地方都说 drawingView.frame,改为说 drawingView.bounds

(其实你应该说drawingView.layer.bounds,而不是简单的drawingView.bounds,但碰巧它们是一回事。)

但是,还有第二个问题,就是你的形状层没有大小。因此它的 position 与其左上角相同。出于这个原因,你最好通过说

将它置于其超级层的中心
shapeLayer.frame = drawingView.layer.bounds

然后您将拥有完全占据绘图视图的形状图层。 (如果你给形状图层一个背景颜色,你将能够清楚地看到这一点。)现在你的问题是你想确保绘图路径本身在 in 形状中居中层,但这是一个不同的练习。