gpt4 book ai didi

ios - 在 UITableViewCell 中添加 AVPlayer 或 MPMoviePlayerController 的最佳位置是什么?

转载 作者:可可西里 更新时间:2023-11-01 17:03:52 27 4
gpt4 key购买 nike

当用户点击单元格中的播放按钮时,我尝试在 UITableViewCell 中播放视频。

最佳答案

场景 1:

如果您愿意在每个单元格中自动播放 Facebook 或 Instagram 等视频,请考虑在 cellForRowAtIndexPath 中添加 AVPlayer

AVPlayer 将不允许您在创建后更改正在播放的 url(AVURLAsset url)。因此,如果您正在使用 AVPlayer 并向播放器提供您自己的 View ,恐怕每次在 cellForRowAtIndexPath 中创建 AVPlayer 实例是唯一的解决方案。 p>

另一方面,如果您打算使用 AVPlayerViewController,您可以在单元格的 awakeFromNib AVPlayer viewController 实例code> 所以每个单元格只有一个播放器实例,并且在 cellForRowAtIndexPath 中,您每次都可以传递不同的 url。您可以使用单元格的 prepareForReuse 方法暂停播放器并重置所有播放器属性。

场景 2:

如果您打算在用户点击单元格中的按钮后播放,请考虑在点击按钮时创建 AVPlayer/AVPlayerViewController 并播放视频。使用 prepareForReuse 重置您的播放器的属性,以确保您在滚动和重复使用单元格时不会播放错误的视频。

编辑:

由于 OP 要求提供一些代码片段,因此提供了框架代码。这不是复制粘贴代码,想法只是给出如何在单元格内使用 AVPlayerViewController 的想法,代码可能存在编译器问题。

//创建一个自定义的tableViewCell子类

class ImageTableViewCell: UITableViewCell {
@IBOutlet weak var carsImageView: UIImageView!
var playerController : AVPlayerViewController? = nil
var passedURL : URL! = nil

override func awakeFromNib() {
super.awakeFromNib()
playerController = AVPlayerViewController()
// Initialization code
}

func configCell(with url : URL) {
//something like this
self.passedURL = url
//show video thumbnail with play button on it.
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}

@IBAction func playOrPauseVideo(_ sender: UIButton) {
let player = AVPlayer(url: url)
playerController.player = player
playerController?.showsPlaybackControls = true
playerController.player.play()
//add playerController view as subview to cell
}

override func prepareForReuse() {
//this way once user scrolls player will pause
self.playerController.player?.pause()
self.playerController.player = nil
}
}

上面的代码在 prepareForReuse() 中将 PlayerController 设置为 nil,因此当用户滚动 tableView 并且单元格离开 tableView 框架并被重用,播放器会暂停并且不会保持状态。如果您只是想在用户滚动回同一个单元格时暂停并重播,您将不得不将播放器保存在单元格外的某个地方,并找到一种将播放器实例映射到单元格的方法。

最后在cellForRowAtIndexPath调用中,

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell : ImageTableViewCell = tableView.dequeueReusableCell(withIdentifier: "imageCell") as! ImageTableViewCell
cell.configCell(with: URL(string: "https://google.com")!)
....
}

编辑 2:

由于 OP 完全解决了在任何时间点只播放一个视频并在点击播放按钮时暂停其他播放视频的问题,我之前的回答将不再适用。

较早的回答允许用户播放多个视频。

这里是修改后的答案,以使其工作。

按如下方式修改您的自定义单元格类。

protocol VideoPlayingCellProtocol : NSObjectProtocol {
func playVideoForCell(with indexPath : IndexPath)
}

class ImageTableViewCell: UITableViewCell {
@IBOutlet weak var carsImageView: UIImageView!
var playerController : AVPlayerViewController? = nil
var passedURL : URL! = nil
var indexPath : IndexPath! = nil
var delegate : VideoPlayingCellProtocol = nil

override func awakeFromNib() {
super.awakeFromNib()
playerController = AVPlayerViewController()
// Initialization code
}

func configCell(with url : URL,shouldPlay : Bool) {
//something like this
self.passedURL = url
if shouldPlay == true {
let player = AVPlayer(url: url)
if self.playerController == nil {
playerController = AVPlayerViewController()
}
playerController.player = player
playerController?.showsPlaybackControls = true
playerController.player.play()
}
else {
if self.playerController != nil {
self.playerController.player?.pause()
self.playerController.player = nil
}
//show video thumbnail with play button on it.
}
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
}

@IBAction func playOrPauseVideo(_ sender: UIButton) {
self.delegate.playVideoForCell(self.indexPath)
//add playerController view as subview to cell
}

override func prepareForReuse() {
//this way once user scrolls player will pause
self.playerController.player?.pause()
self.playerController.player = nil
}
}

在您的 TableView VC 中创建一个名为

var currentlyPlayingIndexPath : IndexPath? = nil

让你的 TableView VC 确认 VideoPlayingCellProtocol

extension ViewController : VideoPlayingCellProtocol {
func playVideoForCell(with indexPath: IndexPath) {
self.currentlyPlayingIndexPath = indexPath
//reload tableView
self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .none)
}
}

最后修改你的cellForRowAtIndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell : ImageTableViewCell = tableView.dequeueReusableCell(withIdentifier: "imageCell") as! ImageTableViewCell
//delegate setting here which u missed
cell.delegate = self
//let the cell know its indexPath
cell.indexPath = indexPath

cell.configCell(with: URL(string: "https://google.com")!, shouldPlay: self.currentlyPlayingIndexPath == indexPath)
....
}

这就是你所需要的。

关于ios - 在 UITableViewCell 中添加 AVPlayer 或 MPMoviePlayerController 的最佳位置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44404053/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com