如何在UIView中居中子视图?

时间:2018-10-23 12:56:16

标签: ios swift xcode uiview addsubview

我正在尝试创建一个计时器。我有一个使用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)
}

但是,当代码运行时,它看起来像这样;

Not in the centre

我尝试了多种方法来使进度条居中,但似乎没有一种起作用。例如,使用frame.height / 2无效。

如何使进度条居中?

谢谢。

编辑: bgShapeLayer的定义如下:

let bgShapeLayer = CAShapeLayer()

1 个答案:

答案 0 :(得分:4)

问题可能是这样的短语:

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

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

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内部坐标具有大致等价的关系,但是这种混淆不是一个好习惯进入。您应该说出自己的意思,而不要依赖偶然性。