質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

92.01%

  • Swift

    3553questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    2061questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

swift3 Xcode8 Timerを使って音楽再生時にUISliderを自動に動かしたい

解決済

回答 1

投稿 2017/01/08 11:27

  • 評価
  • クリップ 0
  • VIEW 188

RieMatsui

score 15

音楽再生時にUISliderを自動で動かしたい

音楽再生アプリを作成しています。再生アプリ上のUISliderで現在の再生再生箇所を割り当てて途中から再生できるようにしていますが、そのバーを再生が進むたびにUISliderを少しづつ移動させたいのですが、Timerをわりあてて、作成をしたいのですが、Timerの使い方がわかりません。Xcode8になって仕様が変わった部分もあり、苦慮しています。
また再生する楽曲は、秒数に直し、UISliderのmaximumの値に割り当てています。

今現在のソースコード

//
//  ViewController.swift
//  Music
//
//  Created by 松井 里衣 on 2017/01/07.
//  Copyright © 2017年 松井 里衣. All rights reserved.
//

import UIKit
import AVFoundation
import QuartzCore

class ViewController: UIViewController, AVAudioPlayerDelegate{

    @IBOutlet weak var slSwichMusic: UISwitch!
    @IBOutlet weak var imgvMusic: UIImageView!
    @IBOutlet weak var slMusicSize: UISlider!

    //フィールドを作成、AVAudioPlayerオブジェクト
    var Music01:AVAudioPlayer!

    // MARK: - オーバーライドメソッド

    override func viewDidLoad() {
        super.viewDidLoad()

        initMusic()
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - デリゲート・メソッド

    //音楽の再生完了
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {

        //スイッチをオフにする

        slSwichMusic.isOn = false
        animateEnd(target: imgvMusic, key: "Move")

    }

    // MARK: - アクション・メソッド

    //音楽を再生するスイッチを作成
    @IBAction func playSwitch(_ sender: UISwitch) {
        NSLog("\(sender.isOn)")

        //再生
        if sender.isOn == true {
            Music01.play()

        //アニメーション開始の処理
        animateStart(target: imgvMusic, key: "Move")

        }

        //停止
        else{

            Music01.stop()

        //アニメーション停止処理
            Music01.prepareToPlay()
            Music01.currentTime = 0.0
            slMusicSize.value = 0.0
            animateEnd(target: imgvMusic, key: "Move")
        }
    }

    //再生速度の変化
    @IBAction func changeRate(_ sender: UISlider){

        NSLog("\(sender.value)")

        //再生速度の設定(0.0~2.0)

        Music01.rate = sender.value

    }

    //再生場所の設定
    @IBAction func musicSizeChange(_ sender: UISlider) {
        Music01.currentTime = TimeInterval(sender.value)

    }

    // MARK: - オリジナル・メソッド

    //再生準備のメソッドを作成,初期化処理
    func initMusic() {

        let bnd = Bundle.main
        let url01 = bnd.url(forResource: "YouAreTheUniverseBrandNewHeavies", withExtension: "mp3")!

        //AVAudioPlayerオブジェクト生成
        Music01 = try? AVAudioPlayer(contentsOf:url01)

        //設定(再生速度の変更許可)
        Music01.enableRate = true

        //設定(デリゲート)
        Music01.delegate = self

        //再生準備
        Music01.prepareToPlay()

        //タイマーを割り当てる


    }

    // MARK: - オリジナルメソッド(アニメーション)

    // アニメーション開始
    func animateStart(target: UIView, key: String!) {

        // 設定(種類(Z軸回転))
        let ani = CABasicAnimation(keyPath: "transform.rotation.z")

        // 設定(変化値(ラジアン角))
        ani.fromValue = 0.0            // 0°
        ani.toValue   = 2.0 * M_PI    // 360°

        // 設定(アニメーション時間(秒))
        ani.duration = 2.0

        // 設定(繰返し回数)
        ani.repeatCount = HUGE        // 無限

        // アニメーション開始
        target.layer.add(ani, forKey: key)
    }

    // アニメーション停止
    func animateEnd(target: UIView, key: String!) {

        // アニメーション削除
        target.layer.removeAnimation(forKey: key)
    }

}

試したこと

Timer、メソッドを作成して
http://qiita.com/kaorumori/items/c923dea8a0324e9256b1
このページなどを参考にしましたがロジックがよくわかってないため
組み立て方がわかりませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

Xcode8 swift3
https://github.com/RieMatsui/github-Music
に実際のソースコードを載せています。

  • 気になる質問をクリップする

    クリップした質問に回答があった場合に通知・メールを受け取ることができます。

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Swift3ではありませんが以下のサイトで同じ事を解説してます、参考になると思います。

参考URL: Swiftでオーディオプレイヤー:UISliderの設置と、曲の再生時間や再生箇所との同期

とりあえず動いたので変更部分だけ載せておきます。

// 以下を追加
var timer = Timer()

//音楽を再生するスイッチを作成
@IBAction func playSwitch(_ sender: UISwitch) {
    NSLog("\(sender.isOn)")

    //再生
    if sender.isOn == true {
        Music01.play()

        //アニメーション開始の処理
        animateStart(target: imgvMusic, key: "Move")

        // 以下を追加
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updatePlayingTime), userInfo: nil, repeats: true)

    } else {

        //停止

        // 以下を追加
        timer.invalidate()

        Music01.stop()

        //アニメーション停止処理
        Music01.prepareToPlay()
        Music01.currentTime = 0.0
        slMusicSize.value = 0.0
        animateEnd(target: imgvMusic, key: "Move")
    }
}

//再生場所の設定
@IBAction func musicSizeChange(_ sender: UISlider) {
    Music01.currentTime = TimeInterval(sender.value)

    // 以下を追加
    self.updatePlayingTime()
}

// 以下を追加
func updatePlayingTime() {
    slMusicSize.value = Float(Music01.currentTime)
}

投稿 2017/01/08 11:52

編集 2017/01/08 12:09

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/01/08 12:39

    _Kentarouさん
    前回同様、お答えいただきありがとうございます。
    timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updatePlayingTime), userInfo: nil, repeats: true)

    これのtargetとselectorの設定がわからず、アップデートできていなかったようです。
    すごく助かりました。またURLも参考にさせていただきます。
    timer.invalidate()で停止処理もすごく勉強になりました。

    毎回本当にわかりやすく的確な回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

92.01%

関連した質問

同じタグがついた質問を見る

  • Swift

    3553questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    2061questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

閲覧数の多いXcodeの質問