iOS 視頻播放器-模塊化您的控制層

播放器的控制層有不少種, 例如在Cell上播放, 與在單一的視圖上, 控制層顯示的可能不同. 有的小夥伴可能會在一個控制層中加上判斷去顯示不一樣的UI. 我在這裏提供另一種方法, 就是控制層切換器.git

切換器的好處:

  • 模塊化控制層
  • 控制層的複用(你們能夠把寫好的控制層push上來, 我集成到pod中)

圖解

下圖爲SJVideoPlayer默認的控制層:github

  • 默認的邊緣控制層
  • 默認的邊緣控制.gif
  • 默認的剪輯控制層
  • 默認的剪輯控制層.gif

在上圖能夠看到, 當點擊邊緣控制層的剪輯按鈕後, 邊緣控制層退出, 同時剪輯控制層出現(截屏/剪輯/GIF).ide

因此切換的思路就是每一個控制層, 都默認實現一個入場和一個退出的方法. 在切換時, 經過調用控制層入場(new control layer)仍是退出(old control layer)的方法進行切換. 不過, 這個功能須要兩個前提條件模塊化

前提:

  • 基於SJVideoPlayer
  • 每一個控制層需實現退出和進場方法

切換器的功能:

目前切換器的功能以下:atom

  • 可以 根據標識 添加/刪除/切換 控制層
  • 控制層的標識能夠本身擴展, 也能夠經過相同的標識去替換一個原始存在的控制層
  • 擴展標識.png

相關類:

相關類分別是切換器(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在這裏:
一個簡單的實現.gifcode

尾巴

項目地址: https://github.com/changsanji...rem

個人郵箱: changsanjiang@gmail.comget

若是您有什麼建議, 望請聯繫我!

相關文章
相關標籤/搜索