测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年9月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Sonam Dhingra 维护。
依赖 | |
ASValueTrackingSlider | >= 0 |
Alamofire | ~> 4.4 |
AlamofireImage | ~> 3.1 |
SnapKit | ~> 3.2.0 |
这个框架使用了 VIPER 架构(修改为 VIPE)。它从一个对架构本身的实验开始,现在还在开发中。
这是一个围绕 AVFoundation 框架的 swift 包装器。使用它来在简单的视图或源中播放远程或本地视频。它的目的是让你在 iOS 应用程序中轻松地播放渐进式下载和直播流。
这个框架还在开发中。单元测试、VIPE 重构和错误修复正在进行中。
在 iOS 社区中讨论了 VIPER 架构;然而,它不常用。我们希望深入了解这种设计模式,了解所有这些热议的焦点。因此,我们决定测试以下假设:
作为一个开发者,我希望使用 VIPER 设计模式来构建可重用模块
我们决定实验 VIPER 和播放视频内容。播放视频涉及 UI 更新、数据下载和数据同步。这些复杂性和交互证明了自己是一个值得考虑的 VIPER 结构化模块的候选者。
import VideoPlaybackKit
let videoType = VPKVideoType.local(videoPathName: "Elon_Musk", fileType: "mp4", placeholderImageName: "elon_1")
VPKVideoPlaybackBuilder.vpk_buildVideoView(for: videoType, shouldAutoplay: self.shouldAutoPlay, playbackBarTheme: self.toolBarTheme) { [weak self] (videoView) in
self?.view.addSubview(videoView)
videoView.snp.makeConstraints({ (make) in
make.height.equalTo(self?.view.snp.height).dividedBy(2)
make.top.equalTo(self?.view.snp.top).offset(10)
make.left.right.equalTo(self?.view)
})
}
class VideoTableViewCell: UITableViewCell, VPKViewInCellProtocol {
static let identifier = "VideoCell"
var videoView: VPKVideoView? {
didSet {
self.setupVideoViewConstraints()
layoutIfNeeded()
}
}
override func prepareForReuse() {
super.prepareForReuse()
prepareForVideoReuse() //Extension default
}
}
tableView.register(VideoTableViewCell.self, forCellReuseIdentifier: VideoTableViewCell.identifier)
tableView.estimatedRowHeight = 400
tableView.rowHeight = UITableViewAutomaticDimension
datasource.asObservable().bind(to: tableView.rx.items(cellIdentifier: VideoTableViewCell.identifier)) { index, model, cell in
guard let cell = cell as? VideoTableViewCell else { return }
VPKVideoPlaybackBuilder.vpk_buildViewInCell(for: model, at: NSIndexPath(item: index, section: 0), completion: { [weak self] (videoView) in
cell.videoView = videoView
cell.layoutIfNeeded()
})}.addDisposableTo(disposeBag)
tableView.rx.setDelegate(self)
}
实现以下内容
extension FeedViewController: VPKTableViewVideoPlaybackScrollable {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
handleAutoplayInTopVideoCell() // default implementation
trackVideoViewCellScrolling() // default implementation
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if shouldAutoplayVideos {
handleAutoplayInTopVideoCell()
}
}
}
videoPrefetcher = VPKTableViewPrefetchSynchronizer(videoItems: datasource.value)
tableView.prefetchDataSource = self
extension FeedViewController: UITableViewDataSourcePrefetching {
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
videoPrefetcher?.tableView(tableView, prefetchRowsAt: indexPaths)
}
func tableView(_ tableView: UITableView, cancelPrefetchingForRowsAt indexPaths: [IndexPath]) {
videoPrefetcher?.tableView(tableView, cancelPrefetchingForRowsAt: indexPaths)
}
}