使用AVPlayer自定義支持全屏的播放器(五)——Swift重構版本

前言

很早之前開源了一個簡單的視頻播放器氏捞,由于年久失修流强,效果慘目忍睹,最近特意花時間對其進行了深度重構争占。舊版本后期不再維護砰盐,新版本使用Swift實現(xiàn)闷袒,后續(xù)會增加更多功能。不想看文字的請自行下載代碼------>>>CLPlayer

舊版本 VS 重構版本

1.新版本使用Swift岩梳,舊版本使用Objective-C

2.新版本采用自定義轉場實現(xiàn)全屏囊骤,舊版本使用旋轉屏幕

3.新版本不需要手動銷毀播放器

4.新版本修復了老版本遺留bug

5.新版本降低了代碼耦合性

6.新版本增加了倍數(shù)播放,切換填充模式

7.新版本提供更豐富的API

8.新版本適配了iPhone X

9.新版本移除了狀態(tài)欄相關配置

效果

效果圖
全屏
控制面板
UITableView
4.png

功能

  • 支持全屏模式冀值、小屏模式
  • 支持跟隨手機自動旋轉
  • 支持本地視頻也物、網絡URL
  • 支持UITableView
  • 支持UICollectionView
  • 支持手勢改變屏幕的亮度(屏幕左半邊)
  • 支持手勢改變音量大小(屏幕右半邊)
  • 支持拖動UISlider快進快退
  • 支持iPhone X留海屏
  • 支持倍速播放(0.5X列疗、1.0X滑蚯、1.25X、1.5X抵栈、1.75X告材、2X
  • 支持動態(tài)改變播放器的填充模式(適應、拉伸古劲、填充
  • 支持cocoapods

接入指南

項目必須支持全屏斥赋,建議將屏幕支持方向交由當前顯示的控制器自行管理。

項目支持全屏方案

1.先勾選支持方向产艾,只保留portrait疤剑,保證APP啟動不會橫屏

image.png

2.AppDelegate中重寫func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {}方法

func application(_: UIApplication, supportedInterfaceOrientationsFor _: UIWindow?) -> UIInterfaceOrientationMask {
        return .allButUpsideDown
}

3.在父類中重寫屏幕控制相關方法

UITabBarController

// 是否支持自動轉屏
override var shouldAutorotate: Bool {
    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.shouldAutorotate ?? false }
    return navigationController.topViewController?.shouldAutorotate ?? false
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.supportedInterfaceOrientations ?? .portrait }
    return navigationController.topViewController?.supportedInterfaceOrientations ?? .portrait
}

// 默認的屏幕方向(當前ViewController必須是通過模態(tài)出來的UIViewController(模態(tài)帶導航的無效)方式展現(xiàn)出來的滑绒,才會調用這個方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait }
    return navigationController.topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}

UINavigationController

// 是否支持自動轉屏
override var shouldAutorotate: Bool {
    return topViewController?.shouldAutorotate ?? false
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return topViewController?.supportedInterfaceOrientations ?? .portrait
}

// 默認的屏幕方向(當前ViewController必須是通過模態(tài)出來的UIViewController(模態(tài)帶導航的無效)方式展現(xiàn)出來的,才會調用這個方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}

UIViewController

// 是否支持自動轉屏
override var shouldAutorotate: Bool {
    return false
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

// 默認的屏幕方向(當前ViewController必須是通過模態(tài)出來的UIViewController(模態(tài)帶導航的無效)方式展現(xiàn)出來的骚露,才會調用這個方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return .portrait
}

4.部分頁面需要支持多方向

在對應控制器中重寫以下方法

override var shouldAutorotate: Bool {
    return true
}

// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .allButUpsideDown
}

基礎配置

public struct CLPlayerConfigure {
    /// 頂部工具條隱藏風格
    public enum CLPlayerTopBarHiddenStyle {
        /// 小屏和全屏都不隱藏
        case never
        /// 小屏和全屏都隱藏
        case always
        /// 小屏隱藏蹬挤,全屏不隱藏
        case onlySmall
    }

    /// 自動旋轉
    public var isAutoRotate = true
    /// 手勢控制
    public var isGestureInteractionEnabled = true
    /// 是否顯示更多面板
    public var isShowMorePanel = true
    /// 頂部工具條隱藏風格
    public var topBarHiddenStyle: CLPlayerTopBarHiddenStyle = .onlySmall
    /// 工具條自動消失時間
    public var autoFadeOut: TimeInterval = 5
    /// 默認拉伸方式
    public var videoGravity: AVLayerVideoGravity = .resizeAspectFill
    /// 頂部工具條背景顏色
    public var topToobarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
    /// 底部工具條背景顏色
    public var bottomToolbarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
    /// 進度條背景顏色
    public var progressBackgroundColor: UIColor = .white.withAlphaComponent(0.35)
    /// 緩沖條緩沖進度顏色
    public var progressBufferColor: UIColor = .white.withAlphaComponent(0.5)
    /// 進度條播放完成顏色
    public var progressFinishedColor: UIColor = .white
    /// 轉子背景顏色
    public var loadingBackgroundColor: UIColor = .white
    /// 返回按鈕圖片
    public var backImage: UIImage?
    /// 更多按鈕圖片
    public var moreImage: UIImage?
    /// 播放按鈕圖片
    public var playImage: UIImage?
    /// 暫停按鈕圖片
    public var pauseImage: UIImage?
    /// 進度滑塊圖片
    public var sliderImage: UIImage?
    /// 最大化按鈕圖片
    public var maxImage: UIImage?
    /// 最小化按鈕圖片
    public var minImage: UIImage?
    /// 封面圖片
    public var maskImage: UIImage?
}

總結

本次重構為Swift第一版,后續(xù)會持續(xù)更新棘幸,定制化開發(fā)請自行參考CLPlayer修改 , 如果喜歡误续,歡迎star。

參考資料

  1. iOS播放器全屏方案

  2. iOS狀態(tài)欄

  3. iOS播放器全屏旋轉實現(xiàn)

  4. iOS橫豎屏旋轉解決方案 - Swift

  5. iOS視頻旋轉探究

  6. iOS屏幕旋轉的解決方案

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蹋嵌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栽烂,更是在濱河造成了極大的恐慌,老刑警劉巖腺办,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怀喉,居然都是意外死亡,警方通過查閱死者的電腦和手機躬拢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門躲履,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聊闯,你說我怎么就攤上這事工猜。” “怎么了馅袁?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵域慷,是天一觀的道長。 經常有香客問我汗销,道長犹褒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任弛针,我火速辦了婚禮叠骑,結果婚禮上,老公的妹妹穿的比我還像新娘削茁。我一直安慰自己宙枷,他們只是感情好掉房,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慰丛,像睡著了一般卓囚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诅病,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天哪亿,我揣著相機與錄音,去河邊找鬼贤笆。 笑死蝇棉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的芥永。 我是一名探鬼主播篡殷,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼埋涧!你這毒婦竟也來了板辽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棘催,失蹤者是張志新(化名)和其女友劉穎戳气,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巧鸭,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年麻捻,在試婚紗的時候發(fā)現(xiàn)自己被綠了纲仍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡贸毕,死狀恐怖郑叠,靈堂內的尸體忽然破棺而出乡革,到底是詐尸還是另有隱情,我是刑警寧澤沸版,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布视粮,位于F島的核電站橙凳,受9級特大地震影響笑撞,放射性物質發(fā)生泄漏茴肥。R本人自食惡果不足惜荡灾,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一卧晓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郁稍,春花似錦胜宇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽系洛。三九已至,卻和暖如春定页,著一層夾襖步出監(jiān)牢的瞬間绽诚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工卒落, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留导绷,地道東北人屎飘。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像檐盟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子导犹,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容