ios - 如何在 UICollectionViewCell 中使用 AVPlayer 平滑滚动
问题描述
但是,我将一个嵌入其中AVPlayer
,UICollectionViewCell
因此,我的滚动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
}
解决方案
推荐阅读
- angular - angular mat-calendar 在 i18n 语言环境的日期之后添加一个句点
- angular - 使用 ng2-smart-table 进行角度翻译
- c++ - Lua 表字段偶尔更改/丢失
- keycloak - 将 Keycloak 与组存储联合(如用户存储联合)一起使用
- installation - 在 Mac Mojave 安装 Ros 动力学
- c# - 根据多个选定的列表框项目在列表框中显示数据
- javascript - 如何处理首屏隐藏的图像
- python - ValueError:GeoDataFrame 的真值不明确
- amazon-web-services - 构建工件忽略 aws codebuild 中的空文件夹
- c - C中链表的指针基数和顶部