Как создать слой AVPlayer в ячейке tableView вне функции tableView? - PullRequest
0 голосов
/ 31 августа 2018

Я создаю приложение, похожее на Instagram, в котором я хочу показать изображение обложки для видео, а затем при нажатии кнопки воспроизведения (на изображении) воспроизводится видео. Я могу создавать и показывать записи по желанию, однако, когда я нажимаю кнопку воспроизведения, воспроизводится видео (я слышу звук), но оно не отображается.

Я пытаюсь отобразить видео в случае 1: ниже

Я обрабатываю функцию кнопки воспроизведения вне tableView в функции @bjc.

Я думаю, что моя проблема заключается в установке playerLayer.frame в нужную ячейку / представление, но я не совсем уверен. Буду признателен за любую помощь. Вот мой код Спасибо!

ОБНОВЛЕНО с РЕШЕНИЕМ: Благодаря смещению в правильном направлении я узнал, что для доступа к ячейке табличного представления мне нужно было использовать свойство sender. В этом случае sender.superview дал мне представление, к которому я пытался получить доступ.

Код обновлен ниже с исправлением. Спасибо за помощь!

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let post = posts[indexPath.section]

    switch indexPath.row {
    case 0:
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostHeaderCell") as! PostHeaderCell
        cell.userProfileImage.sd_setImage(with: post.userPhotoURL, placeholderImage: #imageLiteral(resourceName: "NinjaIcon"), options: [], completed: nil)
        cell.usernameLabel.text = post.username

        return cell

    case 1:
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostImageCell") as! PostImageCell
        cell.postImage.sd_setImage(with: post.photoURL, placeholderImage: #imageLiteral(resourceName: "photo-7"), options: [], completed: nil)
        cell.playButton.isHidden = false 
        cell.playButton.addTarget(self, action: #selector(handlePlay), for: .touchUpInside)
        cell.playButton.tag = indexPath.section


        return cell

    case 2:
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostActionCell") as! PostActionCell
        cell.delegate = self
        configureCell(cell, with: post)

        return cell

    default:
        fatalError("Error: unexpected indexPath")
    }
}

@objc func handlePlay(sender: UIButton!) {

    let cell = sender.superview

    let tag = sender.tag
    let post = posts[tag]
    let text = post.postText
    let videoURLString = post.videoURL
    let player = AVPlayer(url: videoURLString!)

    let playerLayer = AVPlayerLayer(player: player)
    playerLayer.frame = cell.postImage.bounds
    cell.postImage.layer.addSublayer(playerLayer)

    player.play()

    // test to make sure the right video is playing
    print("for text: ",text)
    print("Attempting to Play: ",videoURLString )

}
...