###前提・実現したいこと
ご覧いただき、ありがとうございます。
現在、Collection ViewのCell内に音声を再生するためのボタンを置き、
ストリーミングで再生する機能を作っています。
下記のコードでは、音声が再生されているかを調べ、
再生ボタンと停止ボタンを分岐させています。
ですが、このやり方ですと、コレクションビューをスクロールすると、全てのセルに反映されてしまい、再生している時は全てのセルで停止ボタンが表示されてしまいます。
音声再生中の特定セルのみの再生状態を読み取り、再生中のセルのボタンの状態を変化させるには、どうすればよいのでしょうか?
また、他にベストな方法があるのでしょうか?
宜しくお願いします。
cell.playButton.setImage(UIImage(named: "play"), for: UIControlState.normal) cell.playButton.setImage(UIImage(named: "stop"), for: UIControlState.selected) cell.playButton.isSelected = false if !(mediaPlayer.rate == 0.0){ cell.playButton.isSelected = true }else{ cell.playButton.isSelected = false } cell.playButton.addTarget(self,action:#selector(playButtonDidTouch(sender:)), for: .touchUpInside)
###該当のソースコード
class AudioViewController: UIViewController { var mediaPlayer = AVPlayer() override func viewDidLoad() { super.viewDidLoad() } //コレクションビュー関連 extension AudioViewController : UICollectionViewDataSource { func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { cell.playButton.tag = indexPath.row cell.playButton.setImage(UIImage(named: "play"), for: UIControlState.normal) cell.playButton.setImage(UIImage(named: "stop"), for: UIControlState.selected) cell.playButton.isSelected = false if !(mediaPlayer.rate == 0.0){ cell.playButton.isSelected = true }else{ cell.playButton.isSelected = false } cell.playButton.addTarget(self,action:#selector(playButtonDidTouch(sender:)), for: .touchUpInside) return cell } func playButtonDidTouch(sender:UIButton) { if (sender.isSelected){ mediaPlayer.pause() sender.isSelected = false } else{ let url = "" do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)} catch {print("エラー")} let playerItem = AVPlayerItem( url:NSURL( string:url! )! as URL ) mediaPlayer = AVPlayer(playerItem:playerItem) mediaPlayer.rate = 1.0 mediaPlayer.play() sender.isSelected = true } } }
###試したこと
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Storyboard.CellIdentifier, for: indexPath) as! AudioCollectionViewCell cell.playButton.tag = indexPath.row if let optionalIndexPath = currentSelectedIndexPath{ if (indexPath == optionalIndexPath){ cell.playButton.setImage(UIImage(named: "stop"), for: UIControlState.selected) } else{ cell.playButton.setImage(UIImage(named: "play"), for: UIControlState.normal) } } cell.playButton.addTarget(self,action:#selector(playButtonDidTouch(sender:)), for: .touchUpInside) return cell } func playButtonDidTouch(sender:UIButton) { let cell = sender.superview?.superview as! UICollectionViewCell let indexPath = collectionView.indexPath(for: cell)! currentSelectedIndexPath = indexPath if (sender.isSelected){ mediaPlayer.pause() sender.isSelected = false sender.setImage(UIImage(named: "play"), for: UIControlState.normal) } else{ let row = sender.tag let url = "" do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)} catch {print("エラー")} let playerItem = AVPlayerItem( url:NSURL( string:url! )! as URL ) mediaPlayer = AVPlayer(playerItem:playerItem) mediaPlayer.rate = 1.0 mediaPlayer.play() sender.isSelected = true sender.setImage(UIImage(named: "stop"), for: UIControlState.normal) } }
###補足情報(言語/FW/ツール等のバージョンなど)
Swift 3での実装
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/20 05:38
2017/04/20 06:45 編集
2017/04/20 08:59
2017/04/20 16:05
2017/04/21 01:41