2016-08-05 3 views
0

私はテーブルビューを持ち、各セルには再生ボタンがあります。再生ボタンは、再生と一時停止の画像を切り替えるUIButtonです。再生/一時停止ボタンが押されると、AVAudioPlayerは、セルに関連付けられたオーディオファイルを再生/一時停止します。今のところ、私は完全にオーディオプレーヤーと同期してトグルする画像を持っています。しかし、オーディオの再生が終了したら、画像をデフォルトの状態(再生ボタンの画像)に戻したいと思います。AVAudioPlayerの再生終了時にテーブルビューのセルイメージを切り替えます

//View controller containing tableview 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = self.audioTable.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! AudioCell 

    let track = self.sectionTracks[indexPath.row] 

    cell.playButton.addTarget(self, action: #selector(HomeController.playPausePressed(_:)), forControlEvents: UIControlEvents.TouchUpInside) 

    var playButtonImage = UIImage(named: "TableViewCellPlayButton84.jpg") 
    var pauseButtonImage = UIImage(named: "TableViewCellPauseButton84.jpg") 
    playButtonImage = playButtonImage?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 
    pauseButtonImage = pauseButtonImage?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 

    cell.playButton.setImage(playButtonImage, forState: UIControlState.Normal) 
    cell.playButton.setImage(pauseButtonImage, forState: UIControlState.Selected) 
    cell.playButton.selected = false 

    return cell 
} 

func playPausePressed(sender:UIButton) { 

    let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.audioTable) 
    let cellIndexPath = self.audioTable.indexPathForRowAtPoint(pointInTable) 
    let track = self.sectionTracks[cellIndexPath!.row] 

    //Handle AVAudioPlayer play/pause functionality 
} 

//Custom tableview cell file 
@IBAction func playPausePressed(sender: UIButton!) { 

    if (sender.selected) 
    { 
     sender.selected = false 
    } 
    else{ 
     sender.selected = true 
    } 
} 

答えて

0

AVAudioPlayerの代理人としてサブスクライブして、オーディオが完了したことを確認できます。一度に複数のファイルを再生できますか?複数を再生できる場合は、再生中のすべてのオーディオを追跡してから、デリゲートが開始されたときとプレーヤーが関連付けられた行に基づいて行のボタンを切り替える必要があります。 1つしか再生できない場合は、ユーザーがオーディオの再生を開始するとその行を保存し、オーディオが終了するとその行のボタンをトグルします。

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerDelegateProtocolReference/

private var xoAssociationKey: UInt8 = 0 

extension AVAudioPlayer { 
    var name: String! { 
     get { 
      return objc_getAssociatedObject(self, &xoAssociationKey) as? String 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 
} 

AVAudioPlayerインスタンスに名前を保存するために、上記のように拡張子を作るために役に立つかもしれません。次に、再生中のオーディオの名前と変更可能な辞書内のセルのインデックスパスを追跡することができます。デリゲート関数optional func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)にコールを戻すと、そのボタンのセルへのインデックスパスを戻すplayer.nameの辞書を辞書で見ることができます。テーブルビューからセルを取得し、ボタンの選択状態を切り替えます。オーディオだったボタンのセル・インデックス・パスに設定する再生開始時に、あなたがvar playingAudioIndexPath:NSIndexPath?

として、あなたのクラスに変数を追加することができます一度遊んで、単一セルの場合

EDIT

クリックした

そして、再生終了イベントにだけセルをつかむと、

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, 
          successfully flag: Bool) { 
    guard let indexPath = self.playingAudioIndexPath, 
     cell = self.table.cellForRowAtIndexPath(indexPath) as? AudioCell else { 
     return; 
    } 

    cell.playButton.selected = false 
    self.playingAudioIndexPath = nil 
} 

DMCApps

+0

に感謝し、ボタンを切り替えます。 1つのセルのオーディオファイルが再生されていて、別のファイルが選択されて再生されている場合、前のファイルの再生が停止します。前に 'audioPlayerDidFinishPlaying'を使用しましたが、正直なところ、' cellForRowAtIndexPath'以外のセルボタンのプロパティにアクセスしています。あなたが何を示唆しているか試してみてください。 – Brosef

+0

ファイルに 'var playingAudioIndexPath:NSIndexPath'を格納できるはずです。オーディオが開始されると、インデックスパスを再生しているセルにこの値を設定します。次に、 'audioPlayerDidFinishPlaying'が呼び出されたときに、' let cell = self.table.cellForRowAtIndexPath(self.playingAudioIndexPath)? AudioCell {//ここでボタンをセルでトグルして実行}を実行し、値をnilに設定します – DMCApps

+0

は単セル再生用のコードサンプルを追加しました – DMCApps

関連する問題