播放器的控制層有不少種, 例如在Cell上播放, 與在單一的視圖上, 控制層顯示的可能不同. 有的小夥伴可能會在一個控制層中加上判斷去顯示不一樣的UI. 我在這裏提供另一種方法, 就是控制層切換器.git
下圖爲SJVideoPlayer默認的控制層:github
邊緣控制層
剪輯控制層
在上圖能夠看到, 當點擊邊緣控制層的剪輯按鈕後, 邊緣控制層退出, 同時剪輯控制層出現(截屏/剪輯/GIF).ide
因此切換的思路就是每一個控制層, 都默認實現一個入場
和一個退出
的方法. 在切換時, 經過調用控制層入場(new control layer)仍是退出(old control layer)的方法進行切換. 不過, 這個功能須要兩個前提條件模塊化
目前切換器的功能以下:atom
相關類分別是切換器(SJControlLayerSwitcher)和數據載體(SJControlLayerCarrier)
咱們先預覽一下代碼, 看開頭的的 init方法 就行
:spa
#pragma mark - switcher @interface SJVideoPlayer : SJBaseVideoPlayer /// 1. 控制層切換器 @property (nonatomic, strong, readonly) SJControlLayerSwitcher *switcher; // ... @end @implementation SJVideoPlayer - (instancetype)init { self = [super init]; if ( !self ) return nil; /// 2. 添加一個控制層 [self.switcher addControlLayer:self.defaultEdgeCarrier]; /// 3. 切換到添加的控制層 [self.switcher switchControlLayerForIdentitfier:SJControlLayer_Edge toVideoPlayer:self]; return self; } // ... @end /// 切換器 /// 1. 當前控制層標識 /// 2. 前一個控制層的標識 /// 3. 切換控制層 /// 4. 添加/刪除/獲取 控制層 #pragma mark - SJControlLayerSwitcher - 切換器 @interface SJControlLayerSwitcher : NSObject - (instancetype)init; /// 當前標識(控制層的標識) @property (nonatomic, readonly) SJControlLayerIdentifier currentIdentifier; /// 前一個標識 @property (nonatomic, readonly) SJControlLayerIdentifier previousIdentifier; /// 切換控制層 /// 將當前的控制層切換爲指定標識的控制層 - (void)switchControlLayerForIdentitfier:(SJControlLayerIdentifier)identifier toVideoPlayer:(__kindof SJBaseVideoPlayer *)videoPlayer; - (BOOL)switchToPreviousControlLayer; // 切換到以前的控制層 /// 添加一個控制層 - (void)addControlLayer:(SJControlLayerCarrier *)carrier; /// 刪除一個控制層 - (void)deleteControlLayerForIdentifier:(SJControlLayerIdentifier)identifier; /// 根據標識獲取一個控制層 - (nullable SJControlLayerCarrier *)controlLayerForIdentifier:(SJControlLayerIdentifier)identifier; @end /// 控制層數據載體 /// 1. 播放器的DataSource /// 2. 播放器的Delegate /// 3. 控制層退出執行的block /// 4. 控制層入場執行的block #pragma mark - SJControlLayerIdentifier & SJControlLayerCarrier typedef long SJControlLayerIdentifier; @interface SJControlLayerCarrier : NSObject @property (nonatomic, strong, readonly) id <SJVideoPlayerControlLayerDataSource> dataSource; @property (nonatomic, strong, readonly) id <SJVideoPlayerControlLayerDelegate> delegate; @property (nonatomic, readonly) SJControlLayerIdentifier identifier; @property (nonatomic, copy, readonly) void(^exitExeBlock)(SJControlLayerCarrier *carrier); @property (nonatomic, copy, readonly) void(^restartExeBlock)(SJControlLayerCarrier *carrier); @end
以上爲切換器的源實現, 添加-刪除-切換-查詢 這些功能.rest
在init方法中, 我默認添加了一個邊緣控制層, 而且經過切換器切換到了該控制層. 我寫了一個 Demo在這裏:code
項目地址: https://github.com/changsanji...rem
個人郵箱: changsanjiang@gmail.comget
若是您有什麼建議, 望請聯繫我!