播放器的控制层有不少种, 例如在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
若是您有什么建议, 望请联系我!