2017-03-13 24 views
1

ViewControllerAVAudioPlayerです。今私はこのコードを持っていますswift 3:UISliderを追加するには?

import UIKit 
import AVFoundation 

var audioPlayer = AVAudioPlayer() 

class ViewController: UIViewController { 

@IBOutlet weak var slider: UISlider! 
@IBOutlet weak var playButton: UIButton! 
var index = 0 
var timer: Timer? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if index == 0{ 

     let url = Bundle.main.url(forResource: "1", withExtension: "mp3")! 

     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: url) 
      audioPlayer.prepareToPlay() 
      //audioPlayer.play() 
      //play(sender:AnyObject.self as AnyObject) 

     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 
} 

@IBAction func slide(_ slider: UISlider) { 
    audioPlayer.currentTime = TimeInterval(slider.value) 
} 

@IBAction func play(sender: AnyObject) { 
    if !audioPlayer.isPlaying{ 
     audioPlayer.play() 
     // **** The line below is the new line **** 
     timer = Timer(timeInterval: 1.0, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true) 
     RunLoop.main.add(timer!, forMode: .commonModes) 
    } else { 
     audioPlayer.pause() 
     playButton.setImage(UIImage(named: "pause.png"), for: UIControlState.normal) 
     timer?.invalidate() 
    } 
} 

func updateSlider(_ timer: Timer) { 
    slider.value = Float(audioPlayer.currentTime) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
} 

私はオーディオファイルを介してスクラブを変更するUISliderを追加したいと思います。どうやってするの?

+0

音量を変更するか、オーディオファイルをスクラブしますか? – 0x6368

+0

@ 0x6368オーディオファイルのスクラブを変更したい –

答えて

2

まず、あなたは時にスライダー値の変更あなたのクラスが通知され確認するために、スライダーから新しいIBActionを追加する必要があります(ここでは、「ユーザー操作への応答」を探してください:https://developer.apple.com/reference/uikit/uislider#2557863

このイベントハンドラで、あなた

@IBAction func slide(_ slider: UISlider) { 
    audioPlayer.currentTime = TimeInterval(slider.value) 
} 

は、スライダーが現在の時刻に応じてその値を更新し確認するために、オーディオ、現在の時刻に設定する必要があり、あなたはスライダー値を更新するカスタムメソッドを呼び出すプレーヤーを起動したときにタイマーを追加する必要があります。そして、あなたはスライダーあなたがプロパティを作成する必要が

override func viewDidLoad() { 
    super.viewDidLoad() 

    if index == 0{ 

     let url = Bundle.main.url(forResource: "1", withExtension: "mp3")! 

     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: url) 
      audioPlayer.prepareToPlay() 
      // **** These two lines below are new **** 
      slider.maximumValue = Float(audioPlayer.duration) 
      slider.value = 0.0 
     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 
} 

そして最後に最大値を設定する必要がありますが、スライダーの値に

func updateSlider(_ timer: Timer) { 
    slider.value = Float(audioPlayer.currentTime) 
} 

を更新するメソッドを作成する必要があります。その後

@IBAction func play(sender: AnyObject) { 
    if !audioPlayer.isPlaying{ 
     audioPlayer.play() 
     // **** The line below is the new line **** 
     timer = Timer(timeInterval: 1.0, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true) 
     RunLoop.main.add(timer, forMode: .commonModes) 
    } else { 
     audioPlayer.pause() 
     playButton.setImage(UIImage(named: "pause.png"), for: UIControlState.normal) 
     timer.invalidate() 
    } 
} 

タイマーを保持するIBOutlets以下

var timer: Timer? 
+0

繰り返しタイマーは 'self'を保持し、' self'は 'timer'を保持しているようです。 'invalidate()'はサイクルを中断しますが、オーディオの再生中に画面を離れるとクリーンアップが必要になることがあります。 – Edgar

+0

仕事です。しかし、私がスライダーをこすって凍っています。それを修正するには? –

+0

編集:私は[0x6368](http://stackoverflow.com/users/1213411/0x6368)の答えをスライダーのフリーズを修正するために、実行ループの共通モードに 'timer 'を含めるように更新しましたスクロールするとき。 – Edgar

関連する問題