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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

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

Swift

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

Q&A

解決済

1回答

2612閲覧

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

RieMatsui

総合スコア27

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/01/08 02:27

###音楽再生時に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
に実際のソースコードを載せています。

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

クリップした質問は、後からいつでもMYページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

swift

1// 以下を追加 2var timer = Timer() 3 4//音楽を再生するスイッチを作成 5@IBAction func playSwitch(_ sender: UISwitch) { 6 NSLog("\(sender.isOn)") 7 8 //再生 9 if sender.isOn == true { 10 Music01.play() 11 12 //アニメーション開始の処理 13 animateStart(target: imgvMusic, key: "Move") 14 15 // 以下を追加 16 timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updatePlayingTime), userInfo: nil, repeats: true) 17 18 } else { 19 20 //停止 21 22 // 以下を追加 23 timer.invalidate() 24 25 Music01.stop() 26 27 //アニメーション停止処理 28 Music01.prepareToPlay() 29 Music01.currentTime = 0.0 30 slMusicSize.value = 0.0 31 animateEnd(target: imgvMusic, key: "Move") 32 } 33} 34 35//再生場所の設定 36@IBAction func musicSizeChange(_ sender: UISlider) { 37 Music01.currentTime = TimeInterval(sender.value) 38 39 // 以下を追加 40 self.updatePlayingTime() 41} 42 43// 以下を追加 44func updatePlayingTime() { 45 slMusicSize.value = Float(Music01.currentTime) 46}

投稿2017/01/08 02:52

編集2017/01/08 03:09
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RieMatsui

2017/01/08 03:39

_Kentarouさん 前回同様、お答えいただきありがとうございます。 timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updatePlayingTime), userInfo: nil, repeats: true) これのtargetとselectorの設定がわからず、アップデートできていなかったようです。 すごく助かりました。またURLも参考にさせていただきます。 timer.invalidate()で停止処理もすごく勉強になりました。 毎回本当にわかりやすく的確な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問