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의 대리인으로 가입 한 다음 오디오가 완료되었는지 확인할 수 있습니다. 한 번에 여러 파일을 재생할 수 있습니까? 여러 번 재생할 수있는 경우 재생중인 모든 오디오를 추적 한 다음 델리게이트가 시작된시기와 플레이어가 연결된 행을 기반으로 행의 단추를 토글해야합니다. 하나만 재생할 수있는 경우 사용자가 오디오 재생을 시작하면 해당 행을 저장하고 오디오가 끝나면 해당 행의 버튼을 토글합니다.

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?

과 같이 클래스에 변수를 추가 할 수 있습니다 클릭 함.

그런 다음 재생 마무리 이벤트에 바로 셀을 잡고 버튼을

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

감사를 전환. 한 셀의 오디오 파일이 재생되고 다른 파일이 재생되도록 선택되면 이전 파일의 재생이 중지됩니다. 이전에'audioPlayerDidFinishPlaying'을 사용했지만, 솔직히 말해서, 'cellForRowAtIndexPath' 외부의 셀 버튼 속성에 액세스하고 있습니다. 당신이 제안하고있는 것을 시도해보십시오. – Brosef

+0

파일에'var playingAudioIndexPath : NSIndexPath'를 저장할 수 있어야합니다. 오디오가 시작되면 인덱스 경로를 재생하는 셀에이 값을 설정하십시오. 그런 다음'audioPlayerDidFinishPlaying'가 호출 될 때'if cell = self.table.cellForRowAtIndexPath (self.playingAudioIndexPath)? AudioCell {// 여기에서 버튼을 토글하여 셀에서 실행}을 선택하고 값을 0으로 설정합니다. – DMCApps

+0

에 단일 셀 재생을위한 코드 샘플이 추가되었습니다. – DMCApps