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

问题描述 投票:0回答:1

我正在使用纹理 (AsyncDisplayKit)。其中,我创建了 ASTableNode 并添加了分页,我想创建像 tiktok 这样的视频提要。 我的代码可以正常工作,但同时播放两个视频。我希望一次全屏播放一个视频,就像 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)
}}
ios swift avplayer asyncdisplaykit
1个回答
0
投票

尝试像这样控制暂停和播放

    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()
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.