環(huán)境
- Xcode 11.3
- Swift 5.1
- YYBlog
需求
有時(shí)候在電腦上下周好了電影诈嘿,但是想用手機(jī)看,而系統(tǒng)又沒(méi)有自帶這套操作的工具偎球,
于是就干脆自己寫(xiě)一個(gè)吧瞳秽,順便練習(xí)下剛學(xué)的Swift UI。
說(shuō)明一下啼县,這篇文章主要是演示Swift UI材原,工程里面使用的播放控件是基于IJKMediaFramework封裝好的一個(gè)ViewController沸久,在Github上找的這個(gè)工程 Swift-IJKPlayer小改了下,懶得自己再寫(xiě)??余蟹,也練習(xí)了Swift UI中使用UIKit卷胯。
完整工程代碼:YYVedioPlayer,github單個(gè)文件限制100M威酒,就放到gitlab去了
先來(lái)看下最終效果:
分析
需求很簡(jiǎn)單窑睁,思路也很簡(jiǎn)單,只需要2個(gè)界面就ok:
- 一個(gè)播放器界面
- 一個(gè)列表頁(yè)可以展示指定目錄的所有文件和子目錄
- 點(diǎn)擊文件就將對(duì)應(yīng)url傳遞給播放器界面
- 點(diǎn)擊目錄就push一個(gè)新的列表頁(yè)并展示對(duì)應(yīng)的內(nèi)容
- 左滑刪除功能
當(dāng)我們打開(kāi)App的時(shí)候兼搏,首先要展示的是Documents下面的內(nèi)容卵慰,因?yàn)樵贗nfo.plist里面設(shè)置UIFileSharingEnabled = true后,電腦里的文件只能拷貝到App的這個(gè)目錄佛呻。
下面就開(kāi)始擼代碼了裳朋。
Service層
首先,創(chuàng)建一個(gè)VedioManager吓著,提供文件模型和相關(guān)的方法:
- load方法根據(jù)傳入的路徑鲤嫡,返回File數(shù)組(目錄放在數(shù)組前面,普通文件在后面)
- delete方法刪除指定的File绑莺,以及它包含的內(nèi)容
里面用到了YYFile暖眼,這個(gè)其實(shí)是JohnSundell 寫(xiě)的庫(kù)Files,很好用纺裁,我只是照著寫(xiě)了一遍诫肠,方便更好理解和使用。
另外他的博客全是Swift相關(guān)教程欺缘,很屌很炸天栋豫。
代碼如下:
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
}
}