HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 在滚动CollectionView期间不必要地打开YouTube播放器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在聊天机器人,其中不同类型的响应来自服务器,我在聊天屏幕中使用UICollectionView单元格显示响应.根据服务器响应呈现不同类型的单元.当服务器响应播放视频时,我正在呈现包含youtube播放器的单元格.我正在使用 https://github.com/kieuquangloc147/YouTubePlayer-Swift.问题是当我滚动聊天屏幕(collectionView)时,youtube播放器一次又一次地打开.有时它会阻止所有UI元素并停止滚动.我尝试了不同的方法,但无法解决它.这是代码
PlayerView:
import UIKit

class PlayerView: UIView,YouTubePlayerDelegate {

    override init(frame: CGRect) {
        super.init(frame: framE)
        addYotubePlayer()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // youtube player
    lazy var youtubePlayer: YouTubePlayerView = {
        let viewFrame = UIScreen.main.bounds
        let player = YouTubePlayerView(frame: CGRect(x: 0,y: 0,width: viewFrame.width - 16,height: viewFrame.height * 1/3))
        player.delegate = self
        return player
    }()

    // used as an overlay to dismiss the youtube player
    let blackView = UIView()

    // youtube player loader
    lazy var playerInDicator: UIActivityInDicatorView = {
        let inDicator = UIActivityInDicatorView()
        inDicator.activityInDicatorViewStyle = .whiteLarge
        inDicator.hidesWhenStopped = true
        return inDicator
    }()

    // shows youtube player
    func addYotubePlayer() {
        if let window = UIApplication.shared.keyWindow {
            blackView.frame = window.frame
            self.addSubview(blackView)
            blackView.BACkgroundColor = UIColor(white: 0,alpha: 0.5)
            let tap = UITapGestureRecognizer(target: self,action: #SELEctor(handleDismiss))
            tap.numberOfTapsrequired = 1
            tap.cancelsTouchesInView = false
            blackView.addGestureRecognizer(tap)


            let centerX = UIScreen.main.bounds.size.width / 2
            let centerY = UIScreen.main.bounds.size.height / 2

            blackView.addSubview(playerInDicator)
            playerInDicator.center = CGPoint(x: centerX,y: centerY)
            playerInDicator.startAnimaTing()

            blackView.addSubview(youtubePlayer)
            youtubePlayer.center = CGPoint(x: centerX,y: centerY)

            blackView.alpha = 0
            youtubePlayer.alpha = 0

            UIView.animate(withDuration: 0.5,delay: 0,usingSpringWithDamping: 1,initialSpringVeLocity: 1,options: .curveEaSEOut,animations: {
                self.blackView.alpha = 1
                self.youtubePlayer.alpha = 1
            },completion: nil)
        }
    }

    func play(_ videoID: String) {
        youtubePlayer.loadVideoID(videoID)
    }

    @objc func handleDismiss() {
        blackView.removeFromSuperview()
        UIApplication.shared.keyWindow?.viewWithTag(24)?.removeFromSuperview()
        UIApplication.shared.keyWindow?.removeFromSuperview()
    }

    func playerReady(_ videoPlayer: YouTubePlayerView) {
        self.playerInDicator.stopAnimaTing()
    }

    func playerStateChanged(_ videoPlayer: YouTubePlayerView,playerState: YouTubePlayerStatE) {
    }

    func playerQualityChanged(_ videoPlayer: YouTubePlayerView,playBACkQuality: YouTubePlayBACkQuality) {
    }

}

YouTubePlayerCell(我在collectionView中显示的母鸡服务器响应视频):

import UIKit

class YouTubePlayerCell: ChatmessageCell {

    var player: PlayerView = PlayerView(frame: UIScreen.main.bounds)

    override func setupViews() {
        super.setupViews()
        setupCell()
    }

    func setupCell() {
        messageTextView.frame = CGRect.zero
        textBubbleView.frame = CGRect.zero
    }

    func loadVideo(with videoID: String) {
        player.tag = 24
        UIApplication.shared.keyWindow?.addSubview(player)
        player.play(videoID)
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        player.removeFromSuperview()
        UIApplication.shared.keyWindow?.viewWithTag(24)?.removeFromSuperview()
    }

}

以下是我在UICollectionView的cellForItemAt方法中呈现YouTubePlayerCell的方法

let message = messages[indexPath.row]
    if message.actionType == ActionType.video_play.rawValue {
                if let cell = collectionView.dequeueReusableCell(withReusEIDentifier: ControllerConstants.youtubePlayerCell,for: indexPath) as? YouTubePlayerCell {
                    self.resignResponders()
                    if let videoId = message.videoData?.identifier {
                        cell.loadVideo(with: videoId)
                    }
                    return cell
                }
            }

完整的源代码可以在这里找到:https://github.com/imjog/susi_iOS/tree/ytplayer

解决方法

我可以在下面的代码中看到
if let videoId = message.videoData?.identifier {
                        cell.loadVideo(with: videoId)
                    }

你正在调用loadVideo方法,它负责显示播放器.因此,在滚动时,您正在重用单元格,它会调用loadVideo方法并呈现播放器.所以解决方案是在显示单元格时认不开始播放视频,在单元格视频覆盖上提供播放/暂停按钮,然后单击开始播放视频的按钮.如果我的分析错误,请告诉我,你有什么确切的问题.

大佬总结

以上是大佬教程为你收集整理的ios – 在滚动CollectionView期间不必要地打开YouTube播放器全部内容,希望文章能够帮你解决ios – 在滚动CollectionView期间不必要地打开YouTube播放器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。