Как анимировать рисунок фигуры за 60 секунд? - PullRequest
0 голосов
/ 06 июля 2018

Я новичок в Swift и у меня не так много информации об этом. Я хотел бы создать анимированные часы с заполнением пути ' CAShapeLayer ' во временном интервале, чем пытался сделать это с помощью ' CABasicAnimation 'за 60 секунд. Форма заполняется за 49 секунд, а анимация заканчивается за 60 секунд, поэтому она не работает должным образом. Чем я изменил animation.byValue = 0.1, но результат тот же. У кого-нибудь есть идеи по этому вопросу?

Мой код:

    var startAngle = -CGFloat.pi / 2
    var endAngle = CGFloat.pi * 2
    var shapeLayer = CAShapeLayer()

    override func viewDidLoad() {
            super.viewDidLoad()

        let center = view.center
        let circlePath = UIBezierPath(arcCenter: center, radius: 100, startAngle: startAngle, endAngle: endAngle, clockwise: true)
        shapeLayer.path = circlePath.cgPath
        shapeLayer.lineWidth = 20
        shapeLayer.strokeColor = UIColor.lightGray.cgColor
        shapeLayer.fillColor = UIColor.clear.cgColor
        shapeLayer.lineCap = kCALineCapRound
        shapeLayer.strokeEnd = 0
        animate(layer: shapeLayer) //Animation func

            view.layer.addSublayer(shapeLayer)
    }

    private func animate(layer: CAShapeLayer) {
        let animation = CABasicAnimation(keyPath: "strokeEnd")
        animation.fromValue = 0.0
        animation.toValue = 1.0
        animation.duration = 60.0 //I think is counting by seconds?
        animation.repeatCount = .infinity
        animation.fillMode = kCAFillModeForwards
        layer.add(animation, forKey: "strokeEndAnimation")
    }

1 Ответ

0 голосов
/ 06 июля 2018

Проблема в том, как вы создали BezierPath.

Попробуйте вместо этого:

let circlePath = UIBezierPath(arcCenter: .zero, radius: 100, startAngle: 0, endAngle: 2 * CGFloat.pi, clockwise: true)
    shapeLayer.path = circlePath.cgPath
    shapeLayer.lineWidth = 20
    shapeLayer.strokeColor = UIColor.lightGray.cgColor
    shapeLayer.strokeStart = 0
    shapeLayer.strokeEnd = 0
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.lineCap = kCALineCapRound
    shapeLayer.strokeEnd = 0
    shapeLayer.position = self.view.center
    shapeLayer.transform = CATransform3DRotate(CATransform3DIdentity, -CGFloat.pi / 2, 0, 0, 1)

arcCenter должен быть в .zero и установить центр фигуры в качестве центра вида. Ваш круг начнет анимацию с самой правой точки, поэтому добавьте CATransform, чтобы повернуть фигуру на 90 градусов против часовой стрелки.

...