博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 视频播放器-模块化您的控制层
阅读量:5926 次
发布时间:2019-06-19

本文共 2672 字,大约阅读时间需要 8 分钟。

播放器的控制层有很多种, 例如在Cell上播放, 与在单一的视图上, 控制层显示的可能不一样. 有的小伙伴可能会在一个控制层中加上判断去显示不同的UI. 我在这里提供另外一种方法, 就是.

切换器的好处:

  • 模块化控制层
  • 控制层的复用(大家可以把写好的控制层push上来, 我集成到pod中)

图解

下图为默认的控制层:

  • 默认的边缘控制层
  • 默认的边缘控制.gif
  • 默认的剪辑控制层
  • 默认的剪辑控制层.gif

在上图可以看到, 当点击边缘控制层的剪辑按钮后, 边缘控制层退出, 同时剪辑控制层出现(截屏/剪辑/GIF).

所以切换的思路就是每个控制层, 都默认实现一个入场和一个退出的方法. 在切换时, 通过调用控制层入场(new control layer)还是退出(old control layer)的方法进行切换. 不过, 这个功能需要两个前提条件

前提:

  • 基于
  • 每个控制层需实现退出和进场方法

切换器的功能:

目前切换器的功能如下:

  • 能够 根据标识 添加/删除/切换 控制层
  • 控制层的标识可以自己扩展, 也可以通过相同的标识去替换一个原始存在的控制层
  • 扩展标识.png

相关类:

相关类分别是切换器(SJControlLayerSwitcher)和数据载体(SJControlLayerCarrier)

我们先预览一下代码, 看开头的的 init方法 就行:

#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 & SJControlLayerCarriertypedef long SJControlLayerIdentifier;@interface SJControlLayerCarrier : NSObject@property (nonatomic, strong, readonly) id 
dataSource;@property (nonatomic, strong, readonly) id
delegate;@property (nonatomic, readonly) SJControlLayerIdentifier identifier;@property (nonatomic, copy, readonly) void(^exitExeBlock)(SJControlLayerCarrier *carrier);@property (nonatomic, copy, readonly) void(^restartExeBlock)(SJControlLayerCarrier *carrier);@end

以上为切换器的源实现, 添加-删除-切换-查询 这些功能.

在init方法中, 我默认添加了一个边缘控制层, 并且通过切换器切换到了该控制层. 我写了一个 Demo在:

一个简单的实现.gif

尾巴

项目地址:

我的邮箱: changsanjiang@gmail.com

如果您有什么建议, 望请联系我!

转载地址:http://tzsvx.baihongyu.com/

你可能感兴趣的文章
C#关键字as出现的错误
查看>>
[九省联考2018]IIIDX
查看>>
陶哲轩实分析 习题 13.4.10
查看>>
Java并发编程——线程池的使用
查看>>
[转]Javascript 面向对象编程(一):封装
查看>>
golang交叉编译:Linux - Windows
查看>>
C#设计模式:装饰者模式(Decorator Pattern)
查看>>
python机器学习(2:KNN算法)
查看>>
ssh连接超时问题解决
查看>>
【经典算法】——KMP,深入讲解next数组的求解
查看>>
数独个人项目
查看>>
区间覆盖问题 贪心
查看>>
超级楼梯 递推动规
查看>>
Linux C 创建目录函数mkdir相关(转-清新居士)
查看>>
老程序元对于新程序猿交代的事(身体是革命的本钱)
查看>>
spark共享变量
查看>>
了解oracle数据库的情况
查看>>
结构体初始化函数
查看>>
c++ 拾遗
查看>>
图论$\cdot$强连通分量
查看>>