如何使 UIView 中的子视图居中?

How to centre a subview in UIView?

我正在尝试创建一个计时器。我有一个使用 UIBezierPath 的圆圈,我将对其进行动画处理以显示剩余时间。这是绘制形状并将其添加到视图的代码:

func drawBgShape() {
    bgShapeLayer.path = UIBezierPath(arcCenter: CGPoint(x: center.x , y: center.y), radius:
        bounds.width/2, startAngle: -.pi/2, endAngle: 1.5*.pi, clockwise: true).cgPath
    bgShapeLayer.strokeColor = UIColor.red.cgColor
    bgShapeLayer.fillColor = UIColor.clear.cgColor
    bgShapeLayer.lineWidth = 10
    layer.addSublayer(bgShapeLayer)
}

然而,当代码为运行时,它看起来像这样;

我尝试了多种方法来使进度条居中,但其中 none 似乎有效。例如,使用 frame.height/2 没有任何效果。

如何让进度条居中?

谢谢。

编辑: bgShapeLayer 定义如下:

let bgShapeLayer = CAShapeLayer()

问题可能出在这句话上:

arcCenter: CGPoint(x: center.x , y: center.y)

视图中心是视图在其父视图中的位置。那不是你想要的。您想要 of 视图的中心。试试这个:

arcCenter: CGPoint(x: bounds.midX , y: bounds.midY)

但是,如果您为形状图层指定框架、大小和位置,并根据形状图层(毕竟是绘制形状的位置)进行所有操作,效果会更好。例如:

bgShapeLayer.frame = self.layer.bounds
self.layer.addSublayer(bgShapeLayer)
bgShapeLayer.path = UIBezierPath(
    arcCenter: CGPoint(x: bgShapeLayer.bounds.midX, y: bgShapeLayer.bounds.midY), 
    radius: bgShapeLayer.bounds.width/2, 
    startAngle: -.pi/2, endAngle: 1.5*.pi, clockwise: true).cgPath

这样我们就不会像您的代码那样混淆视图坐标和图层坐标。在某种程度上,您可以避免这种情况,因为在这种情况下,视图内部坐标、图层内部坐标和 bgShapeLayer 内部坐标通常是等价的,但这种混淆不是一个好习惯进入。你应该说出你的意思而不是依赖偶然性。