2017-10-03 2 views
2

J'ai une tableView qui obtient des données de la base de données. Certaines des cellules de mon TableView contiennent des vidéos et lorsque nous rencontrons une vidéo, elle s'affiche correctement.Comment puis-je arrêter la vidéo lorsque l'utilisateur fait défiler

Mon problème est que si quelqu'un continue à faire défiler alors cette vidéo continue à jouer. Je voudrais changer cela et si l'utilisateur regarde une partie d'une vidéo continue à défiler alors je voudrais terminer la vidéo juste là. Je pense que je suis proche de résoudre ce problème, mais pas encore là.

Ceci est mon code:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "Home", for: indexPath) as! Home 
    let filename = streamsModel.video_image[indexPath.row] as NSString 
    if filename.pathExtension == "mov" { 
     let movieURL = URL(string: streamsModel.video_image[indexPath.row]) 

     cell.videoCapHeight.constant = CGFloat(Float(cell.pic_height!)) 
     cell.playerView = AVPlayer(url: movieURL!) 
     cell.MyAVPlayer.player = cell.playerView 
     cell.MyAVPlayer.showsPlaybackControls = false 
     cell.MyAVPlayer.view.frame = cell.videoView.bounds 
     cell.videoView.addSubview(cell.MyAVPlayer.view) 
     controller.addChildViewController(cell.MyAVPlayer) 
     cell.playerView?.isMuted = false 
     cell.MyAVPlayer.player?.play() 

    } 
    return cell 
} 

Ce code ci-dessus vérifie simplement si le streamsModel.video_image a une extension .mov (JSON). Si c'est le cas, il obtient le film/vidéo et l'affiche dans un AVPlayer.

Comme vous pouvez le voir dans le code, la méthode Play() est utilisée pour que les vidéos commencent à être lues automatiquement. Le problème est que si une vidéo est, par exemple, d'une minute et que vous en regardez 20 secondes et que vous faites défiler vers le bas, vous entendez toujours cette vidéo et je voudrais arrêter la vidéo dès que l'utilisateur défile.

Ceci est mon code ScrollView maintenant je dois juste arrêter les vidéos sur parchemin ou peut-être dans UITableViewCell:

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if (self.lastContentOffset > scrollView.contentOffset.y + 0) { 
     print("scrolling up") 
    } 
    else if (self.lastContentOffset < scrollView.contentOffset.y) { 
     print("scrolling down") 
    } 
    self.lastContentOffset = scrollView.contentOffset.y 
} 
+0

Donc, si deux cellules l'une à côté de l'autre ont la vidéo et l'affichage en même temps, elles seront lues automatiquement? - pourrait vouloir envisager de changer comment cela fonctionne à un moment donné. – Wez

+0

Pas tout à fait 1 vidéo commence à la fois. Les cellules sont suffisamment grandes pour que vous puissiez être sur une seule cellule à la fois, car elles contiennent d'autres contenus. – user1591668

+0

C'est assez juste pour l'instant, mais que se passe-t-il s'ils sont affichés sur un appareil plus grand? - Je voudrais considérer cela avant qu'un utilisateur ne soit bombardé avec plus de bruit que ce qu'il avait négocié. – Wez

Répondre

2

suggestion de Dan d'utiliser la méthode de délégué de la vue de la table serait bien pour vous ici qui signifie que vous pouvez mettre en pause la vidéo lorsque la cellule sort de l'écran.

Quelque chose comme cela devrait fonctionner:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    // Dequeue the cell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Home", for: indexPath) as! Home 
    // Check the player object is set (unwrap it) 
    if let player = cell.MyAVPlayer.player { 
     // Check if the player is playing 
     if player.rate != 0 { 
      // Pause the player 
      player.pause() 
     } 
    } 
} 

Je suggère que pourrait s'arrêter et jouer automatiquement à nouveau un peu laggy selon le cas il y a mise en mémoire tampon en cours etc ... de sorte que vous voudrez peut-être envisager de permettre à l'utilisateur de lire les vidéos sur un robinet.