环境
- Xcode 11.3
- Swift 5.1
- YYBlog
需求
有时候在电脑上下周好了电影,但是想用手机看,而系统又没有自带这套操作的工具,
于是就干脆自己写一个吧,顺便练习下刚学的Swift UI。
说明一下,这篇文章主要是演示Swift UI,工程里面使用的播放控件是基于IJKMediaFramework封装好的一个ViewController,在Github上找的这个工程 Swift-IJKPlayer小改了下,懒得自己再写🙃,也练习了Swift UI中使用UIKit。
完整工程代码:YYVedioPlayer,github单个文件限制100M,就放到gitlab去了
先来看下最终效果:
分析
需求很简单,思路也很简单,只需要2个界面就ok:
- 一个播放器界面
- 一个列表页可以展示指定目录的所有文件和子目录
- 点击文件就将对应url传递给播放器界面
- 点击目录就push一个新的列表页并展示对应的内容
- 左滑删除功能
当我们打开App的时候,首先要展示的是Documents下面的内容,因为在Info.plist里面设置UIFileSharingEnabled = true后,电脑里的文件只能拷贝到App的这个目录。
下面就开始撸代码了。
Service层
首先,创建一个VedioManager,提供文件模型和相关的方法:
- load方法根据传入的路径,返回File数组(目录放在数组前面,普通文件在后面)
- delete方法删除指定的File,以及它包含的内容
里面用到了YYFile,这个其实是JohnSundell 写的库Files,很好用,我只是照着写了一遍,方便更好理解和使用。
另外他的博客全是Swift相关教程,很屌很炸天。
代码如下:
extension VedioManager {
struct File: Hashable {
let name: String
let path: String
let isFolder: Bool
}
}
class VedioManager {
static let dirDocument: URL = {
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return urls[urls.endIndex - 1]
}()
static let root = dirDocument.path
static func load(at path: String) -> [File] {
if let folder = try? YYFile().createFolderIfNeeded(at: path) {
let folders = folder.subfolders.map {
File(name: $0.name, path: $0.path, isFolder: true)
}
let files = folder.files.map {
File(name: $0.name, path: $0.path, isFolder: false)
}
return folders + files
}
return []
}
static func delete(_ file: File) -> Bool {
do {
try FileManager.default.removeItem(atPath: file.path)
return true
} catch {
print(error)
}
return false
}
}