如何使 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
内部坐标通常是等价的,但这种混淆不是一个好习惯进入。你应该说出你的意思而不是依赖偶然性。
我正在尝试创建一个计时器。我有一个使用 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
内部坐标通常是等价的,但这种混淆不是一个好习惯进入。你应该说出你的意思而不是依赖偶然性。