如何在 tableViewCell 中控制 AVPlayer(通过滑块和搜索播放、暂停、进度)?
Posted
技术标签:
【中文标题】如何在 tableViewCell 中控制 AVPlayer(通过滑块和搜索播放、暂停、进度)?【英文标题】:How to control AVPlayer in a tableViewCell (Play, Pause, Progress via slider and seek)? 【发布时间】:2018-07-26 07:34:41 【问题描述】:我正在尝试使用 AVPlayerLayer 和 AVPlayer 使 tableViewCell 内的视图播放视频。它在按钮点击时播放和暂停。
这已成功完成。
但现在我想展示视频的进度。当我点击播放和暂停按钮时,我可以通过自定义委托在我的 tableView 类中获取currentTime()
。但我需要继续观察进展。我没有找到任何代表(可能是我弄错了文档中列出的代表)。如何实现我的目标?
这是我的 playerView 类:
import UIKit
import AVKit
import AVFoundation
class CustomPlayerView: UIView
override static var layerClass: AnyClass
return AVPlayerLayer.self
var playerLayer: AVPlayerLayer
return layer as! AVPlayerLayer
var player: AVPlayer?
get
return playerLayer.player
set
playerLayer.player = newValue
这是 tableViewCell 类:
import UIKit
import AVFoundation
import AVKit
class VideoCell: UITableViewCell
@IBOutlet weak var myPlayerView: CustomPlayerView!
@IBOutlet var playButton: UIButton!
@IBOutlet var mySlider: UISlider!
var videoPlayDelegate: videoDidplay!
override func awakeFromNib()
super.awakeFromNib()
以下是 cellForRow 和自定义委托函数:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "vidCell", for: indexPath) as! VideoCell
let vidUrl = aRR_VidURL[indexPath.row]
let avPlayer = AVPlayer(url: URL(string: vidUrl)!)
cell.myPlayerView.playerLayer.player = avPlayer
cell.playButton.tag = indexPath.row
cell.playButton.addTarget(self, action: #selector(playAction(sender:)), for: .touchUpInside)
return cell
@objc fileprivate func playAction(sender: UIButton)
let cell = tableView.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as! VideoCell
cell.videoPlayDelegate = self
if sender.currentTitle == "Play"
cell.myPlayerView.player?.play()
sender.setTitle("Pause", for: .normal)
cell.videoPlayDelegate.videoPlaying(cell: cell, playerView: cell.myPlayerView)
else if sender.currentTitle == "Pause"
cell.myPlayerView.player?.pause()
sender.setTitle("Play", for: .normal)
cell.videoPlayDelegate.videoPlaying(cell: cell, playerView: cell.myPlayerView)
protocol videoDidplay
func videoPlaying(cell: VideoCell, playerView: CustomPlayerView)
谢谢!
【问题讨论】:
【参考方案1】:您必须为滑块编写一个函数,就像为按钮操作编写的一样。 可能是这样的:
cellForRow
方法更改为:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "vidCell", for: indexPath) as! VideoCell
let vidUrl = aRR_VidURL[indexPath.row]
let avPlayer = AVPlayer(url: URL(string: vidUrl)!)
cell.myPlayerView.playerLayer.player = avPlayer
cell.slider.addTarget(self, action: #selector(playbackSliderValueChanged), for: .valueChanged)
cell.playButton.tag = indexPath.row
cell.playButton.addTarget(self, action: #selector(playAction(sender:)), for: .touchUpInside)
return cell
滑块功能:
func playbackSliderValueChanged(sender: UISlider)
let position = (sender as AnyObject).convert(CGPoint.zero, to: self.tableView)
let indexPath = self.tableView.indexPathForRow(at: position)!
let cell = tableView.cellForRow(at: IndexPath(row: indexPath.row, section: 0)) as! VideoCell
if let duration = cell.myPlayerView.player?.currentItem?.duration
let totalSeconds = CMTimeGetSeconds(duration)
let value = Float64(sender.value) * totalSeconds
let seekTime = CMTime(value: Int64(value), timescale:1)
cell.myPlayerView.player?.seek(to: seekTime)
if cell.myPlayerView.player!.rate == 0
cell.myPlayerView.player?.play()
else
cell.myPlayerView.player?.pause()
【讨论】:
非常感谢!它有帮助! 在这种情况下我们是否可以使用 AVPlayer 的默认控件?我有与此相同的类,但我不想添加按钮和滑块我想为播放器使用默认播放器控制器我该怎么做?以上是关于如何在 tableViewCell 中控制 AVPlayer(通过滑块和搜索播放、暂停、进度)?的主要内容,如果未能解决你的问题,请参考以下文章
如何更改视图控制器中的标签 我要加载一个 tableviewcell 被选中? [复制]
如何在自定义 tableViewCell 中初始化 UiPickerView?
单击自定义 TableViewCell Swift 4 中的按钮时如何呈现单独的视图控制器?
单击tableview标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器
如何将图像从 TableViewCell 传递到 UIImage
我在 CollectionViewCell 内有一个 UIButton,它又在 TableViewCell 内。如何通过单击 UIButton 导航到下一个视图控制器?