【问题标题】:How can I stop video when user is scrolling用户滚动时如何停止视频
【发布时间】:2018-03-14 22:01:24
【问题描述】:

我有一个从数据库中获取数据的 tableView。我的 TableView 中的一些单元格中包含视频,当我们遇到视频时,它会正确显示。

我的问题是,如果有人继续滚动,那么该视频仍然会继续播放。我想改变这一点,如果用户观看视频的一部分然后继续滚动,那么我想在那里结束视频。我想我已经接近解决这个问题了,但还没有完全解决。

这是我的代码:

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
}

上面的代码只是检查streamsModel.video_image 是否具有 .mov 扩展名 (JSON)。如果是,那么它会获取电影/视频并将其显示在 AVPlayer 中。

从代码中可以看出,使用了Play() 方法,因此视频会自动开始播放。问题是,例如,如果一个视频时长为 1 分钟,而您观看了 20 秒并向下滚动,您仍然会听到该视频正在播放,我想在用户滚动离开时立即停止该视频。

这是我的 scrollView 代码,现在我只需要在滚动或 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
}

【问题讨论】:

  • 那么如果相邻的两个单元格同时有视频和显示,它们会自动播放吗? - 可能需要考虑在某个时候改变它的工作方式。
  • 一次不完全只有 1 个视频开始。这些单元格足够大,因此您一次只能在 1 个单元格上,因为它们包含其他内容。
  • 现在这很公平,但如果它们显示在更大的设备上怎么办? - 我想在用户被更多的噪音轰炸之前考虑这一点。
  • 是的,你说得有道理,我现在会调查一下,因为这肯定会成为一个问题。
  • willDisplayCelldidEndDisplayingCell 委托方法可以告诉您单元格何时打开/关闭屏幕

标签: ios swift uitableview uiscrollview tableview


【解决方案1】:

Dan 关于使用表格视图的委托方法的建议在这里很适合您,这意味着您可以在单元格移出屏幕时暂停视频。

这样的事情应该可以工作:

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()
        }
    }
}

我建议自动暂停和再次播放可能会有点滞后,具体取决于是否正在进行缓冲等...因此您可能需要考虑允许用户点击播放视频。

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2017-08-28
    • 2019-06-23
    • 2019-10-13
    相关资源
    最近更新 更多