🎨

【Swift】進行度に応じて色が変わるプログレスバー風ボタンの作り方

2023/12/07に公開

特定の条件を満たすまで、進行度に応じてボタンがプログレスバーっぽく色がついていくUIを作りたかったんですが、CAGradientLayerを使えば簡単にできました。

分割したViewを置いておく方法もあると思いますが、それだとぐーーんっと色がつく動きをしないのでこっちのほうが良いかなと思います。

    // ex) 5個のアイテム選択が必須条件だとしたら
    private var selectionItems: [Int] = []
    private let maxSelectCount = 5
    
    // gradientLayerの初期設定
    private let gradientLayer = CAGradientLayer()
    private let gradientStartPoint = CGPoint(x: 0, y: 0.5)
    private let gradientEndPoint = CGPoint(x: 1, y: 0.5)
    private let gradientColors = [UIColor.systemBlue.cgColor, UIColor.systemBlue.cgColor, UIColor.clear.cgColor, UIColor.clear.cgColor]
    
    private func configureGradientLayer() {
        gradientLayer.startPoint = gradientStartPoint
        gradientLayer.endPoint = gradientEndPoint
        gradientLayer.colors = gradientColors
        progressView.layer.addSublayer(gradientLayer)
        gradientLayer.locations = [0, 0, 0, 0]
    }

    // セルタップ時に実行するメソッド
    private func tappedView() {
        // 配列操作コードなど
	:
        updateGradientLayer()
    }

    private func updateGradientLayer() {
        let progress = CGFloat(selectionItems.count) / CGFloat(maxSelectCount)
        gradientLayer.frame = progressView.bounds

        let progressLocation = NSNumber(floatLiteral: Double(progress))
        gradientLayer.locations = [0, progressLocation, progressLocation, 1]
    }

Discussion