我正在尝试创建一个计时器。我有一个使用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)
}
但是,当代码运行时,它看起来像这样;
我尝试了多种方法来使进度条居中,但似乎没有一种起作用。例如,使用frame.height / 2无效。
如何使进度条居中?
谢谢。
编辑: bgShapeLayer的定义如下:
let bgShapeLayer = CAShapeLayer()
答案 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
内部坐标具有大致等价的关系,但是这种混淆不是一个好习惯进入。您应该说出自己的意思,而不要依赖偶然性。