Swift 円を描くストロークアニメーション その1

目的の動作

実装コード

ViewController.swift

import UIKit

class ViewController: UIViewController {
    private let shapeLayer = CAShapeLayer()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        drawCircle()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        startAnimation()
    }
    
    /// 円を描くlayer設定
    private func drawCircle() {
        // 円のパスを作成
        let bezierPath = UIBezierPath(
            // 円の中心を画面の中心にする
            arcCenter: view.center,
            // 円の半径を100に設定
            radius: 100,
            // 開始角度を0°に設定 (3時の方向が0°になります)
            startAngle: radian(angle: 0),
            // 終了角度を360°に設定
            endAngle: radian(angle: 360),
            // true: 時計回り, false: 反時計回り
            clockwise: true
        )
        // 線の太さ
        shapeLayer.lineWidth = 3
        // 線のカラー
        shapeLayer.strokeColor = UIColor.blue.cgColor
        // 円の内側のカラー
        shapeLayer.fillColor = UIColor.clear.cgColor
        // 作成したパスを設定する
        shapeLayer.path = bezierPath.cgPath
        // 円を描くlayerを設定する
        view.layer.addSublayer(shapeLayer)
    }
    
    /// 角度をラジアンに変換
    /// - Parameter angle: 角度
    /// - Returns: ラジアン
    private func radian(angle: CGFloat) -> CGFloat {
        Double.pi / 180 * angle
    }
    
    /// アニメーションを開始する
    func startAnimation() {
        // ストロークアニメーションを指定してインスタンス化
        let animation = CAKeyframeAnimation(keyPath: "strokeEnd")
        // 今回は0°~360°の円を描くのでvaluesの0は0°になります。
        // valuesの1は360°になります。
        animation.values = [0, 1]
        // 0°から360°まで描くアニメーションを3秒かけて行う
        animation.duration = 3
        // アニメーションを行いたいレイヤーに作成したアニメーションを設定する
        shapeLayer.add(animation, forKey: nil)
    }
}

まとめ

自分が今よりもっと初学者だった時どうやって実装するかを知りたいときに必要最低限のコードで説明された方が分かりやすい感じたので、円を描くストロークアニメーションの実装方法に必要なことだけをまとめました。

少しでも参考になれば幸いです!