AsyncDisplayKit在Swift中同时播放多个视频的问题



我使用纹理(AsyncDisplayKit)。其中,我创建了ASTableNode并添加了分页,我想创建像tiktok这样的视频提要。我的代码正在工作,但两个视频在同一时间播放。我想要一个视频应该在全屏播放相同的视频源在抖音

我遵循https://mux.com/blog/building-tiktok-smooth-scrolling-on-ios/教程。

我的代码

class ViewController: UIViewController {
var currentPage: Int = 1
var arrayVideos = [String]()
var tableNode: ASTableNode = ASTableNode(style: .plain)
override func viewDidLoad() {
super.viewDidLoad()
self.applyStyle()
self.tableNode.leadingScreensForBatching = 3.0
self.view.addSubnode(tableNode)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableNode.frame = self.view.bounds
}
func applyStyle() {
self.tableNode.delegate        = self
self.tableNode.dataSource      = self
self.tableNode.view.separatorStyle = .singleLine
self.tableNode.view.allowsSelection = true
self.tableNode.isPagingEnabled = true
}}
extension ViewController: ASTableDataSource, ASTableDelegate {
func tableNode(_ tableNode: ASTableNode, numberOfRowsInSection section: Int) -> Int {
return arrayVideos.count
}
func tableNode(_ tableNode: ASTableNode, nodeBlockForRowAt indexPath: IndexPath) -> ASCellNodeBlock {
let cellNodeBlock:() -> ASCellNode = {
let post = self.arrayVideos[indexPath.row]
let cell = VideoPlayerTableCell(with: post)

return cell
}
return cellNodeBlock
}
func tableNode(_ tableNode: ASTableNode, constrainedSizeForRowAt indexPath: IndexPath) -> ASSizeRange {
let width = UIScreen.main.bounds.size.width
let min = CGSize(width: width, height: (UIScreen.main.bounds.size.height))
let max = CGSize(width: width, height: .infinity)
return ASSizeRangeMake(min, max)
}
func shouldBatchFetchForTableNode(tableNode: ASTableNode) -> Bool {
return true
}
func tableNode(_ tableNode: ASTableNode, willBeginBatchFetchWith context: ASBatchContext) {
//Fetching video from server
self.getVideos { newPosts in
self.currentPage = self.currentPage + 1
self.insertNewRowsInTableNode(newPosts: newPosts)
context.completeBatchFetching(true)
}
}
func insertNewRowsInTableNode(newPosts: [String]) {
guard !newPosts.isEmpty else {
return
}
let section = 0
var indexPaths: [IndexPath] = []
let total = arrayVideos.count + newPosts.count
for row in arrayVideos.count ... total - 1 {
let path = IndexPath(row: row, section: section)
indexPaths.append(path)
}
arrayVideos.append(contentsOf: newPosts)
tableNode.insertRows(at: indexPaths, with: .none)
}}
class VideoPlayerTableCell: ASCellNode {
var videoNode: ASVideoNode
var post: String
init(with post: String) {
self.post = post
self.videoNode = ASVideoNode()
super.init()
self.videoNode.shouldAutoplay = true
self.videoNode.shouldAutorepeat = true
self.videoNode.gravity = AVLayerVideoGravity.resizeAspectFill.rawValue
DispatchQueue.main.async() {
self.videoNode.asset = AVAsset(url: URL(string: self.post)!)
}

self.addSubnode(self.videoNode)
}}

试试这样设置控件的暂停和播放

func tableNode(_ tableNode: ASTableNode, willDisplayRowWith node: ASCellNode) {
if let vNode = node as? VideoPlayerTableCell {
vNode.play()
}
}
func tableNode(_ tableNode: ASTableNode, didEndDisplayingRowWith node: ASCellNode) {
if let vNode = node as? VideoPlayerTableCell {
vNode.pause()
}
}

最新更新