開発メモ

開発関係のメモをいろいろと。たぶん。

リピートに対応

動作を確認した環境

環境 情報
Xcode 6.3.2 (6D2105)
iOS 8.3
Swift 1.2
Date 2015/6/7

リピートに対応

すっかり忘れていたリピートへの対応。

リピートと一言に言ってもいろいろあるんだけど、ここでは『全曲リピート』と『リピート無し』の2つの状態に絞って対応。

リピートの状態を取得/設定する部分はこんな感じ。

class SK4MusicPlayerAdmin: NSObject {

    /// リピートの状態を取得/設定
    var repeatFlag: Bool {
        get {
            if player.repeatMode == .All {
                return true
            } else {
                return false
            }
        }

        set {
            if newValue {
                player.repeatMode = .All
            } else {
                player.repeatMode = .None
            }
        }
    }

    ※関係ない部分は省略
}

MPMusicPlayerControllerのrepeatModeをそのまま使ってる。本当なら、リピートの状態はアプリ側で管理するべきなんだけど、この部分はちょっと手抜き。

ユーザーが状態を切り替える部分はこんな感じ。

class ViewController: UIViewController {

    @IBAction func onRepeat(sender: AnyObject) {

        // リピートのフラグを反転
        let flag = g_musicPlayer.repeatFlag
        g_musicPlayer.repeatFlag = !flag

        // 画面を更新
        updateOperation()
    }

    ※関係ない部分は省略
}

単純に、フラグを反転してるだけ。この辺りの操作は特にMPMusicPlayerControllerから通知が来ないので、直接、自分で画面の更新を呼び出してる。

画面の更新を行う部分はこんな感じ。

class ViewController: UIViewController {

    @IBOutlet weak var repeatButton: UIBarButtonItem!

    /// 各種操作に対応するUIを更新
    func updateOperation() {

        // リピートボタンに内部の設定を反映
        // リピートが有効: viewと同じtintColor
        // リピートが無効: tintColorをlightGrayColorに
        if g_musicPlayer.repeatFlag {
            repeatButton.tintColor = view.tintColor
        } else {
            repeatButton.tintColor = UIColor.lightGrayColor()
        }
    }

    ※関係ない部分は省略
}

状態を画面に変更する方法も色いろあるんだけど、今回は、tintColorを切り替えることで表現。有効/無効がわかりにくいので、あまりいいやり方ではない。たぶん。

あとは、アプリの起動時やバックグラウンドからフォアグラウンドに切り替わったタイミングでも、リピートの状態を画面に反映するようにするだけ。

リピートを無効にした時の画面はこんな感じ。

f:id:see_ku:20150607112528p:plain

ソースコード

最終的なソースコードはこちら。

See_Ku / MusicPlayerTips — Bitbucket
https://bitbucket.org/See_Ku/musicplayertips

https://itunes.apple.com/jp/app/four-album-shuffle-arubamu/id866046150?mt=8&uo=4&at=10l8JW&ct=hatenablog