Проигрывание плеера только в одной ячейке?

Чтобы реализовать проигрывание плеера только в одной ячейке в приложении на Swift, вам понадобится использовать пользовательские ячейки таблицы и AVPlayer, который является частью фреймворка AVFoundation.

Вот пошаговая инструкция по реализации:

1. Создайте пользовательскую ячейку для вашей таблицы. Для этого вам нужно создать отдельный файл Swift, наследующийся от UITableViewCell. В этой ячейке вы будете размещать представление, отображающее плеер.

2. В вашем контроллере таблицы создайте переменную типа AVPlayer для хранения экземпляра плеера. Например:

var player: AVPlayer?

3. В методе cellForRowAt indexPath: в вашем контроллере таблицы создайте или переиспользуйте экземпляр вашей пользовательской ячейки. Затем, установите плеер для этой ячейки, используя URL-адрес файла или потока, который вы хотите воспроизвести. Например:

let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
let videoURL = URL(string: "http://www.example.com/video.mp4")
cell.player = AVPlayer(url: videoURL)

4. Внутри пользовательской ячейки вы можете один раз установить плеер для вида, который будет отображать поток видео. Например:

class CustomCell: UITableViewCell {
    var player: AVPlayer? {
        didSet {
            playerLayer.player = player
        }
    }

    private var playerLayer: AVPlayerLayer!

    override func layoutSubviews() {
        super.layoutSubviews()

        playerLayer.frame = bounds
    }

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        playerLayer = AVPlayerLayer()
        contentView.layer.addSublayer(playerLayer)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

5. Для обеспечения правильного проигрывания плеера только в одной ячейке, вы должны управлять жизненным циклом плеера. В связи с этим, вы должны остановить воспроизведение плеера в ячейке, которая перестает быть видимой. Одно место, где вы можете это сделать - это метод tableView(_:didEndDisplaying:forRowAt:):

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // Остановить воспроизведение плеера в этой ячейке
    if let customCell = cell as? CustomCell {
        customCell.player?.pause()
    }
}

Таким образом, при прокрутке таблицы, только видимая ячейка будет иметь работающий плеер, в то время как воспроизведение остановится, когда ячейка уйдет из обзора.