在 Collection View 中使用 AVPlayer 播放音频

Playing Audio using AVPlayer in Collection View

我正在使用 AVPlayer 在 Collection View Cells(Radio App)中播放音频。应用程序工作,但是,如果点击所有单元格上的播放按钮,所有站点一起播放,直到手动停止(请查看两个玩家同时播放的屏幕截图)。

我想做的是,如果按下一个单元格上的播放按钮,其他正在播放的玩家应该停止。任何帮助将不胜感激。

player = AVPlayer(url: "some url")
  func togglePlayer() {
        if player?.rate != 0 {
            player?.pause()
            self.playButton.setBackgroundImage(UIImage(systemName: "play.circle"), for: .normal)
        } else {
            player?.play()
            self.playButton.setBackgroundImage(UIImage(systemName: "stop"), for: .normal)
        }
    }

你可以试试

1- 让播放器 object 在 vc

2- 将单元格内按钮的播放动作添加到 vc 最好使用 addTarget 动作

3- 在 vc 中添加当前 playIndex 最初使其成为 nil Int

4- 设置按钮标签为indexPath.row iside celloForRowAt 播放按钮状态为indexpath.row是否等于playIndex或不

5- 在按钮操作内将 playIndex 设置为 sender.tag

6- 刷新 collection 并开始播放选定的 url

我要做的是添加

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        collectionView.indexPathsForSelectedItems?.filter({ [=10=].section == indexPath.section }).forEach({ collectionView.deselectItem(at: [=10=], animated: false) })
        
        return true
    }

这样一次只能选择给定部分中的一个单元格 或

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        collectionView.indexPathsForSelectedItems?.forEach({ collectionView.deselectItem(at: [=11=], animated: false) })
        
        return true
    }

这将使一次只能选择任何给定部分中的一个单元格。

所以选择您喜欢的那个并在您的自定义单元格中覆盖 isSelected 并使其在 isSelected 为真时播放并在 isSelected 为假时暂停。

public override var isSelected: Bool {
        didSet {
            switch self.isSelected {
            case true:
                //play audio
            case false:
                //pause audio
            }
        }
    }