在我的生命中,我无法将这条贝塞尔路径(下面显示的圆圈)居中。橙色视图被适当地约束并水平对齐,但是当我使用下面的方法向橙色视图添加3层时,我似乎无法将其居中到橙色视图。我将橙色视图声明为spinnerHolder
swift - 将贝塞尔曲线路径居中到UIview?-LMLPHP

private func createCircleShapeLayer(strokeColor: UIColor, fillColor: UIColor) -> CAShapeLayer {
    let layer = CAShapeLayer()

    //The farther from 0 x is for this, the more separated the movements of the 3 paths.
    let circularPath = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0),
                                    radius: 30,
                                    startAngle: 0,
                                    endAngle: 2 * CGFloat.pi,
                                    clockwise: true)
    layer.path = circularPath.cgPath
    layer.strokeColor = strokeColor.cgColor
    layer.lineWidth = 3
    layer.fillColor = fillColor.cgColor
    layer.lineCap = kCALineCapRound
    layer.position = spinnerHolder.center
    return layer
}

最佳答案

1-将arcCenter更改为

let circularPath = UIBezierPath(arcCenter: CGPoint(x:spinnerHolder.frame.width/2, y:spinnerHolder.frame.height/2),
                                radius: 30,
                                startAngle: 0,
                                endAngle: 2 * CGFloat.pi,
                                clockwise: true)

2-评论这个
layer.position = spinnerHolder.center

3-调用内部的方法viewDidLayoutSubviews
var once = false
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if once {
        spinnerHolder.addSublayer(createCircleShapeLayer(,,,,,))
        once = false
    }
}

调用内部viewDidLayoutSubviews不是必需的,在任何时间/任何地方添加它,但不要在VC加载之前添加
4-检查这个Centering CAShapeLayer within UIView Swift

10-08 06:30
查看更多