首页 > 解决方案 > 如何在 UICollectionViewCell 中使用 AVPlayer 平滑滚动

问题描述

但是,我将一个嵌入其中AVPlayerUICollectionViewCell因此,我的滚动UICollectionView总是非常生涩。

我在视频加载后缓存AVAsset并在相同的单元格重新出现时使用它,但它仍然相当生涩,尤其是当它第一次加载视频时。网上似乎没有任何提示/教程,但 Instagram/Twitter/Facebook/Vine 都设法实现了它。

有人对如何实现这一目标有任何提示吗?

我的代码

加载视频:

func loadVideo(from urlString: String, forCell cell: VideoCell) {
    if let video = model.videoCache[urlString] {
        cell.player = AVPlayer(playerItem: AVPlayerItem(asset: video))
    } else if let url = URL(string: urlString) {
        cell.player = AVPlayer(url: url)
        model.videoCache[urlString] = cell.player?.currentItem?.asset
    }
    cell.playerView.player = cell.player
    cell.player?.isMuted = isVideoMuted
    cell.player?.actionAtItemEnd = .none
}

播放器视图:

import UIKit
import AVFoundation

/// A simple UIView subclass that is backed by an AVPlayerLayer layer.
class PlayerView: UIView {
    var player: AVPlayer? {
        get {
            return playerLayer.player
        }
        set {
            playerLayer.player = newValue
        }
    }

    var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }

    override class var layerClass : AnyClass {
        return AVPlayerLayer.self
    }
}

视频单元:

class VideoCell : UICollectionViewCell {
    @IBOutlet var playerView: PlayerView!
    var player: AVPlayer?
}

我正在使用IGListKit来控制我的UICollectionView,所以我的每个单元格都由一个部分控制器控制。它加载单元格的部分UICollectionViewCell是:

override func cellForItem(at index: Int) -> UICollectionViewCell {
    guard let cell = collectionContext?.dequeueReusableCell(withNibName: "VideoCell", bundle: nil, for: self, at: index) as? VideoCell,
        let video = object
        else { fatalError("Could not dequeue video cell") }

    let videoLocation = video.loc
    loadVideo(from: videoLocation, forCell: cell)
    return cell
}

标签: iosswift

解决方案


推荐阅读