畢業(yè)后一直在搞 SDK 開發(fā),說真的,對面 UI 層的知識完全不重視,但工作不是不學(xué)習(xí)的理由,現(xiàn)在空閑時間,補全下自己對 UI 層的基礎(chǔ),也順便熟悉下 Swift。
首先 Demo 點這里 ,整個工程也就一個頁面,四十行的代碼:

視頻錄制
這里使用UIImagePickerController進行視頻錄制,這里其實很簡單,主要就是配置下相關(guān)的參數(shù),因為UIImagePickerController可以實現(xiàn)拍照、錄制視頻、獲取相冊照片和視頻等功能:
private lazy var picker: UIImagePickerController = {
var picker = UIImagePickerController()
picker.mediaTypes = [kUTTypeMovie as String]
picker.sourceType = .camera
picker.cameraCaptureMode = .video
picker.delegate = self
return picker
}()
這里直接使用懶加載的方式設(shè)置picker,我想,很多從oc轉(zhuǎn)到swift時,肯定會糾結(jié)如何實現(xiàn)setter和懶加載這個問題,我承認(rèn)我也入坑過~~~
在頁面實現(xiàn)一個點擊按鈕進行錄制跳轉(zhuǎn):
@IBAction func recordVideo(_ sender: AnyObject) {
present(picker, animated: true, completion: nil)
}
這樣,一個簡單的錄制功能就已經(jīng)完成了,但我們還是需要監(jiān)聽下錄制完成或者取消錄制的回調(diào),從而獲取所需的值:
// MARK: - UIImagePickerControllerDelegate
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
videoUrl = info[UIImagePickerControllerMediaURL] as! URL?
picker.dismiss(animated: true, completion: nil)
}
這里在錄制完成后,獲取保存的url進行訪問。如果 ViewController 內(nèi)容太多,這里是建議通過extension ViewController 來實現(xiàn)對應(yīng)的delegate的回調(diào)方法:
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// MARK: - UIImagePickerControllerDelegate
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
videoUrl = info[UIImagePickerControllerMediaURL] as! URL?
picker.dismiss(animated: true, completion: nil)
}
}
但這里需要注意的是,如果用 extension 時,就要把 videoUrl 的 private 改為 fileprivate。
視頻播放
錄制完成后,就可以使用獲得的視頻url進行播放:
private lazy var playVC: AVPlayerViewController = AVPlayerViewController()
@IBAction func playVideo(_ sender: AnyObject) {
if videoUrl != nil {
let player = AVPlayer(url: videoUrl!)
playVC.player = player
present(playVC, animated: true, completion: nil)
}
}
這里一樣使用了lazy的方法,這里就說明什么使用lazy,用過oc的應(yīng)該懂的。還有,這里使用的雖然是剛才錄制的視頻,但其它的本地視頻文件也是一樣的,傳相應(yīng)url就可以了,但并不是所有格式的視頻都能解碼,詳細(xì)可以看下官方文檔的說明,這里就不詳細(xì)介紹了。
擴展
UIImagePickerController 是實現(xiàn)照片視頻拍攝的,還能獲取本地照片和視頻,看下UIImagePickerControllerSourceType:
public enum UIImagePickerControllerSourceType : Int {
case photoLibrary // 圖庫
case camera // 相機
case savedPhotosAlbum // 相冊
}
UIImagePickerControllerCameraCaptureMode:
public enum UIImagePickerControllerCameraCaptureMode : Int {
case photo // 拍攝照片
case video // 錄制視頻
}
通過設(shè)置相應(yīng)的參數(shù),就可以實現(xiàn)不同的功能,這里就不一一說了,直接看下UIImagePickerController相應(yīng)的api應(yīng)該就可以了。
小結(jié)
工作不是不學(xué)習(xí)的理由,你會就是會,不會就是不會。千里之行,始于足下。