Как использовать AVPlayer и Image в UITableViewCell в зависимости от ответа моего API - PullRequest
0 голосов
/ 10 февраля 2019

Функциональность : мне нужно реализовать просмотр таблицы, где ячейки будут иметь изображение или видео в зависимости от категории в моем API.

Что происходит : Изображения и видео отображаются хорошо, но при отображении ячейки с видео она заменяет все ячейки на AVPlayer, а ячейки с изображениями тоже.

Код : -

(in cellForRowAtIndexPath - )

if (![dict[@"video_360x290"] isEqualToString:@""]) {

 AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:dict[@"video_360x290"]]];
 AVPlayer *playVideo = [[AVPlayer alloc] initWithPlayerItem:playerItem];
 cell.playerViewController = [[AVPlayerViewController alloc] init];
 cell.playerViewController.player = playVideo;
 cell.playerViewController.player.volume = 10;
 cell.playerViewController.view.frame = CGRectMake(0, 0, cell.vPost.frame.size.width, cell.vPost.frame.size.height);
 [cell.vPost addSubview:cell.playerViewController.view];
 [playVideo play];

}
else{
 [cell.iPost sd_setImageWithURL:dict[@"image"] placeholderImage:[UIImage imageNamed:@"imageNotAvailable"] options:SDWebImageHighPriority];
}

Что мне нужно: мне нужна эта ячейка с изображениями для отображения изображений, а ячейка с видео отображает видео Заранее спасибо.

1 Ответ

0 голосов
/ 11 февраля 2019

Пусть имя класса TableViewCell ImageVideoCell

Создать ТРИ ячеек из раскадровки в TableView, 1 для изображения и 2 для видео и изменить идентификатор ячейки.Для Идентификатора ячейки изображения на « ImageCell », а для Идентификатора ячейки видео на « VideoCell1 » и « VideoCell2 » добавьте один и тот же класс tableViewCell во все ячейки, как здесь ImageVideoCell .

А в контроллере

class ViewController: UIViewController {

  // MARK: - Outlets
  @IBOutlet weak var tableView: UITableView!

  // MARK: - Properties
  var imgVideos = [ImgVideo?]()
  var player : AVPlayer?

  // MARK: - View Life Cycle
  override func viewDidLoad() {
    super.viewDidLoad()

    // API call to get Images and videos in TableView
    tableView.dataSource = self
}


 override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    if player?.isPlaying == true {
        self.player?.pause()
        self.player = nil
    }
}

// MARK: - Action
@IBAction func play_pauseButtonPressed(_ sender: UIButton) {

    guard let video = imgVideos[sender.tag] else { return } // get video URl here
    guard let cell = tableView.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as? ImageVideoCell else { return }

    // if Video is already Playing And User want to Pause it then
    if player?.isPlaying ?? false && video.isSelected {
        player?.pause()
        sender.setImage(#imageLiteral(resourceName: "play-button"), for: .normal)

    }
    // if the Video is pause and User want to Play it again
    else if player?.isPlaying ?? true == false && video.isSelected {
        player?.play()
        sender.setImage(#imageLiteral(resourceName: "media-pause"), for: .normal)

    }
    // Play any other Video 
    else {

        for (index, video) in audios.enumerated() {

            if video?.isSelected ?? false {
                video?.isSelected = false
                tableView.beginUpdates()
                tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none)
                tableView.endUpdates()
            }
        }
        video.isSelected = true
        tableView.beginUpdates()
        tableView.reloadRows(at: [IndexPath(row: sender.tag, section: 0)], with: .none)
        tableView.endUpdates()

        guard let cell = tableView.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as? ImageVideoCell else { return }
        cell.play_pauseButton.setImage(#imageLiteral(resourceName: "media-pause"), for: .normal)



        play(videoUrl: vedio.url ?? "") // Play is a function for playing Videos
    }

}

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = ImageVideoCell()
   if Image {
    cell = tableView.dequeueReusableCell(withIdentifier: "ImageCell", for: indexPath) as! ImageVideoCell
   // Display Img
   }else {

     if video?.isSelected ?? false {
      cell = tableView.dequeueReusableCell(withIdentifier: "VideoCell1", for: indexPath) as! ImageVideoCell
     }else {
      cell = tableView.dequeueReusableCell(withIdentifier: "VideoCell2", for: indexPath) as! ImageVideoCell
     }

   }

   cell.play_pauseButton.tag = indexPath.row
   cell.play_pauseButton.setImage(audio?.isSelected ?? false ? #imageLiteral(resourceName: "media-pause") : #imageLiteral(resourceName: "play-button"), for: .normal)
   return cell
  }
}


// MARK: - AVPlayer
  extension AVPlayer {
     var isPlaying: Bool {
         return ((rate != 0) && (error == nil))
     }
  }
...