当前位置: 首页 > 编程日记 > 正文

iOS-FXDanmaku弹幕库介绍、相关技术分享

前言

去年, 2016年, 一大波直播平台在移动端涌出, 直播慢慢步入了人们的视角. 网上如今能够看到各式各样的直播, 如秀场直播、游戏直播、体育直播、娱乐直播等等.

在各种类型的直播中, 弹幕在PC、移动端都几乎成为了标配, 今天在这里主要介绍一下个人开源的iOS弹幕, 以及提前为实现一款弹幕库涉及的相关技术分享的相关篇章占坑, 虽不细至于手把手教如何实现, 但关键点都会有所涉及且不仅限于实现弹幕, 如iOS中用pthread实现生产者消费者模型、响应正在执行动画对象的点击事件、实现某类对象复用的ReuseQueue、使用GCD封装实现可取消未执行代码块的OperationQueue等等, 对这些更感兴趣的朋友麻烦直接滑至最后一段.

由衷欢迎各位大神指点一二.

Github

Talk is cheap, I'll show you the code.
请大力点击上方超链接⬆️⬆️⬆️⬆️⬆️

特性

  1. 除了UI操作, 其他操作都以代码块交给异步队列处理了.(使用GCD提交的代码块, 最终会由XNU kernel根据CPU使用情况创建新的线程去执行或分配给其他线程执行)
  2. 遵循 生产者消费者模式, 通过pthread去阻塞队列而非使用timer或异步队列开启runloop空转
  3. 定义了包含 弹幕块点击、将出现、已消失事件的delegate
  4. 提供 注册复用 自定义弹幕块 的方法
  5. 各种自定义参数, 如弹幕块移速, 弹幕库插入方向(从上, 从下, 随机), 弹幕库移动方向(左到右, 右到左), 重置弹道位移百分比系数(防前后弹幕块碰撞)、弹幕队列容量控制
  6. 简单易用, 控制方法就三个 start(同时也是恢复), pause, stop. 另外大部分方法都是线程安全的
  7. 轻易适配设备方向旋转
  8. 设置单行配置即可作为 跑马灯、直播间公告 使用

预览图



示例

弹幕设置

// Configuration
FXDanmakuConfiguration *config = [FXDanmakuConfiguration defaultConfiguration];
config.rowHeight = [DemoDanmakuItem itemHeight];
config.dataQueueCapacity = 500;
config.itemMinVelocity = 80;  // set random velocity between 80 and 120 pt/s
config.itemMaxVelocity = 120;
self.danmaku.configuration = config;// Delegate
self.danmaku.delegate = self;// Reuse
[self.danmaku registerNib:[UINib nibWithNibName:NSStringFromClass([DemoDanmakuItem class]) bundle:nil]forItemReuseIdentifier:[DemoDanmakuItem reuseIdentifier]];
[self.danmaku registerClass:[DemoBulletinItem class] forItemReuseIdentifier:[DemoBulletinItem reuseIdentifier]];

数据添加

// add data for danmaku view to present
DemoDanmakuItemData *data = [DemoDanmakuItemData data];
[self.danmaku addData:data];

// start running
if (!self.danmaku.isRunning) {[self.danmaku start];
}

代理事件

- (void)danmaku:(FXDanmaku *)danmaku didClickItem:(FXDanmakuItem *)item withData:(DemoDanmakuItemData *)data {// 此处 处理点击
}- (void)danmaku:(FXDanmaku *)danmaku willDisplayItem:(FXDanmakuItem *)item withData:(FXDanmakuItemData *)data {// 此处 处理弹幕块将要出现/展示
}- (void)danmaku:(FXDanmaku *)danmaku didEndDisplayingItem:(FXDanmakuItem *)item withData:(FXDanmakuItemData *)data {// 此处 处理弹幕块完全离开视线,结束展示
}

更多详情 麻烦参照 Gitbub Demo project FXDanmakuDemo.xcworkspace.

有关弹幕库使用问题答疑

1. rowHeight、estimatedRowSpace and rowSpace 三者之间的关系


2. 如何使用nib创建自定义弹幕块



3. 如何适配设备屏幕旋转

如果你的弹幕View 在横竖屏状态下 高度不一样, 比如竖屏高200pt, 横屏约束却是100pt, 那么需要在对应的controller.m文件中加入以下代码(否则 当你的弹幕块使用AutoLayout进行布局时, 横竖屏切换后, 由于视图的frame会变化多次,导致正在展示的弹幕块 出现布局约束冲突的报错)

iOS8+

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {[self.danmaku pause];[self.danmaku cleanScreen];[coordinator animateAlongsideTransition:nilcompletion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {// resume danmaku after orientation did change[self.danmaku start];}];
}

系统版本小于iOS8

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {[self.danmaku pause];[self.danmaku cleanScreen];
}- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {[self.danmaku start];
}

安装

Cocoapods(iOS7+)

  1. Podfile中 视情况对应添加以下内容
     platform :ios, 'xxx'target 'xxx' dopod 'FXDanmaku'end
  2. pod install

Manually(iOS7+)

直接拖动 FXDanmaku 文件夹 到你的项目 对应结构下

介绍结尾

欢迎各位 提出宝贵的issues, 更多功能建议, 或者改进之处等等. 同时若各位想要了解弹幕库具体实现的其他相关点, 也可在评论区留言.

实现一款弹幕库涉及的相关技术分享(占坑)

以下篇章还未开写, 仅提前占坑..未完待续..
iOS中用pthread实现生产者消费者模型
响应正在执行动画对象的点击事件
实现某类对象复用的ReuseQueue
使用GCD封装实现可取消未执行代码块的OperationQueue


相关文章:

【廖雪峰Python学习笔记】字符串与编码

字符串与编码 三种字符编码 ASCII编码 &#xff1a;计算机由美国人发明&#xff0c;最早只有127个字符编码—— 大小写英文字母、数字和符号Unicode&#xff1a;把中文、日文、韩文等所有语言统一到一套编码中&#xff0c;2-4byte&#xff0c;现代OS和大多数语言都支持utf-8&a…

application

说明: 进行应用级操作.比如:设置提醒框,打开其他应用,显示联网状态,控制状态栏 单例对象, UIApplication *app[UIApplication sharedApplication];常用方法 方法1:设置app图标数字提示信息//设置app图标数字提示信息app.applicationIconBadgeNumber10;//ios8以后需要实现以下方…

博客园2013年4月份第2周源码发布详情

Silk Navigation for ASP.NET源码 2013-4-12 [VS2010]功能介绍&#xff1a;Silk Navigation 微软提供&#xff0c;为构建cross-browser 的Web应用程序&#xff0c;是用ASP.NET MVC3和jQuery的。它是非常简单使用ASP.NET Web窗体构建&#xff0c;从而在一个相当小的&#xff0c…

iOS 静态库封装

静态库和动态库 静态库和动态库存在形式 静态库&#xff1a;以.a 和 .framework为文件后缀名。动态库&#xff1a;以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。 静态库和动态库的区别 静态库&#xff1a;链接时会被完整的复制到可执行文件中&#xff0c;被多次使用就有多…

【廖雪峰Python学习笔记】list tuple dict set

列表元组字典集合创建l [1, ‘a’, [1, 3], True]t (1, )d {‘key’ : ‘value’}s set([1, 2, 4, 2, 1])索引l[1]t[0]d.get(‘key’)/插入l.insert(1, ‘3’) / l.append(‘4’)/d[‘k1’] ‘v1’s.add(‘9’)修改l[0] 4/d[‘k1’] v/移除l.pop(0)/d.pop(‘k1’)s.remo…

响应式布局简明示例

响应式布局简明示例&#xff0c;响应式布局最好同时也是自适应布局&#xff0c;然后再配合css3媒体查询&#xff0c;来达到完美的响应式布局。css3的媒体查询ie9一下是不支持的&#xff0c;这太遗憾了&#xff0c;不过幸运的是有大神已经为前端屌丝们写好了用于IE9以下的媒体查…

iOS - APP任意push新页面那些事

大家都知道&#xff0c;UINavigationController对象有一个方法pushViewController&#xff0c;用来做视图跳转&#xff0c;也是在iOS开发中常用的页面转换方法之一。大多数APP的结构一般都是&#xff0c;使用一个UITabBarController&#xff0c;每个tab上都是一个UINavigationC…

主攻ASP.NET.4.5 MVC4.0之重生:Entity Framework生成实体类步骤(十三)

1.新建一个ASP.NET MVC 4.0 项目 2.安装Entity Framework Power Tools 3.Entity Framework- -RepositoryReverse Engineer Code First 4.Install-Package EntityFramework or Update-Package EntityFramework PM -Repository Install-Package EntityFramework 已安装“EntityFr…

【廖雪峰Python学习笔记】高阶函数

Higher-order function高阶函数映射过滤算法排序算法高阶函数 变量可指向函数 >>> abs # 函数 <built-in function abs> >>> abs(-0) # 函数调用 0 >>> func abs # 变量可指向函数 >>> func(-9) # 调用变量 调用函数 9函数名…

丁贵才130702010042第二次作业

第二次作业 2.9 设有如下语句&#xff0c;请用相应的谓词公式分别把它们表示出来&#xff1a; &#xff08;1&#xff09;有的人喜欢梅花&#xff0c;有的人喜欢菊花&#xff0c;有的人既喜欢梅花有喜欢梅花。 解&#xff1a;定义谓词 P&#xff08;x&#xff09;&#xff1a;x…

SpringMVC @RequestBody接收Json对象字符串

以前&#xff0c;一直以为在SpringMVC环境中&#xff0c;RequestBody接收的是一个Json对象&#xff0c;一直在调试代码都没有成功&#xff0c;后来发现&#xff0c;其实 RequestBody接收的是一个Json对象的字符串&#xff0c;而不是一个Json对象。然而在ajax请求往往传的都是Js…

【iOS】自定义日期选择器

自定义了一个日期选择器&#xff0c;与大家分享一下&#xff0c;期待宝贵建议。 github下载地址&#xff1a;https://github.com/huahua0809/XHDatePicker 下面只是说明一下怎么用&#xff0c;具体实现请下载代码看看&#xff1b; 如果大家觉得这个分享有所帮助的话&#xff0c…

【廖雪峰Python学习笔记】函数式编程

Functional Programming高阶函数返回函数匿名函数装饰器偏函数高阶函数 面向过程的程序设计&#xff1a; 把大段代码拆成函数&#xff0c;通过一层层函数调用&#xff0c;可将复杂任务分解成若干简单的任务函数是面向过程的程序设计的基本单位计算机Computer && 计算c…

asp 随机读取ID之Access

我在用ASP连接access 这个桌面数据库的时候&#xff0c;有时候要随机读取ID&#xff0c;传统的办法是&#xff1a; select top 3 * from tablename order by Rnd(ID) 但这样不行&#xff0c;默认还是按ID排序。 解决办法加上timer() 这个函数 select top 3 * from tablenam…

iOS Plist 文件的 增 删 改

一&#xff1a;Plist 文件的创建 Plist 文件作为我们IOS开发的一种数据存储文件&#xff0c;还是经常会用到的。在看《X-code江湖录》的时候&#xff0c;看到了这一点。自己就写了一下&#xff0c;把写的东西分享出来&#xff01;先看看它的创建&#xff0c;它的创建和我们其他…

Shine Button动画效果 类似Tinder APP的卡片界面

Shine Button动画效果--WCLShineButton 类似太阳动画的button FSPagerView 主要使用UICollectionView实现的优雅的屏幕幻灯片效果&#xff0c;主要用于Banner、产品展示、欢迎引导等。有Swift和OC两个版本。 folding-cell 一个可扩展的具有折叠效果的内容单元格 Cell折叠动效…

【廖雪峰Python学习笔记】面向对象编程OOP

面向对象编程 OOP&#xff1a;Object Oriented Programming程序的基本单元&#xff1a;对象 [ 数据 操作数据的函数] [属性 方法]三大特点&#xff1a;数据封装、继承和多态OPP中的计算机程序&#xff1a; 一系列命令的集合 —— 一组函数顺序执行。函数化大为小&#xff0…

基于 CoreText 实现的高性能 UITableView

来源&#xff1a;伯乐在线 - Hawk0620 如有好文章投稿&#xff0c;请点击 → 这里了解详情 如需转载&#xff0c;发送「转载」二字查看说明 引起UITableView卡顿比较常见的原因有cell的层级过多、cell中有触发离屏渲染的代码&#xff08;譬如&#xff1a;cornerRadius、maskTo…

.net程序员面试题

1&#xff0e; 在web页面中不论显示器的分辨率的大小是800600&#xff0c;还是1024768使得页面都显示在屏幕中间。 答&#xff1a;Margin:auto; 2&#xff0e; 请利用正则表达式验证一个字符串是否为数字串 &#xff08;请用csharp&#xff09;。 1 public static b…

Android深度探索与驱动开发(一)

Android移植可分为两个部分&#xff1a;应用移植和系统移植。应用移植是指将应用程序移植到某一特定硬件平台上。由于不同硬件平台之间的差异&#xff0c;Android SDK API也有可能存在差异&#xff0c;或者将应用程序从低版本Android移植到高版本的Android上。为了保证应用程序…

【廖雪峰Python学习笔记】面向对象高级编程

文章目录为实例和类绑定属性和方法\_\_slots__限制当前class实例&#xff0c;对子类不管用property装饰器&#xff0c;将getter方法变成属性多重继承 —— 一个子类可同时获得多个父类的所有功能[Mixin]定制类枚举类元类为实例和类绑定属性和方法 创建类 class Animal(object…

5分钟 搭建免费个人博客

五分钟倒数已经可以计时了。 三步完成免费个人博客搭建&#xff0c; 这是一篇小白也能看懂的文章&#xff0c;本文主要针对mac OS &#xff0c;Windows 除了软件安装方式和命令有些区别&#xff08;装了git bash也一样&#xff09;&#xff0c;其他基本一样。 你可能会经常看到…

基数排序之算法

一、定义基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。由于整数也可以表达字符串&#xff08;比如名字或日期&#xff09;和特定格式的浮点数&#xff0c;所以基数排序也不是只能使用于整数。二、…

MyBaties学习记录

typeAliases详解&#xff1a; 类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关&#xff0c;存在的意义仅在于用来减少类完全限定名的冗余&#xff1b;&#xff08;也就是为类型设置简称&#xff09; 实例: 通过包名称加上简称调用代替&#xff1b; 注解表示: // …

【廖雪峰Python学习笔记】错误、调试、测试

文章目录错误处理调试单元测试unitcase文档测试错误类型程序编写问题bug – 字符类型错误等用户输入错误 – 输入不符合规定的字符串异常&#xff0c;程序运行时无法预测 – 磁盘满了&#xff0c;无法写 错误处理 错误处理机制&#xff1a;try…except…finally… try运行可…

iOS开发——手势识别器(用手势实现图片旋转和缩小放大)

iOS开发中&#xff0c;除了有关触摸的这组方法来控制用户的手指触控外&#xff0c;还可以用UIGestureRecognize的衍生类来进行判断&#xff0c;方便了开发。 UIGestureRecognize的子类类别有以下几种&#xff1a; UITapGestureRecognizer //轻拍识别器UIPinchGestureRecognize…

直播APP常用动画效果

作者: 落影loyinglin 地址: http://www.jianshu.com/p/a9a201ed3aa8 介绍 记录、总结开发遇到一些问题&#xff0c;大家一起交流学习。 这次带来&#xff0c;对直播APP的常用动画总结。 效果展示 下面是一个很多平台都有的入门豪华礼物动画——烟花。 一个复杂的礼物动画&…

windows8下安装Visual Studio2008

windows8下安装Visual Studio2008是一个比较麻烦的事情&#xff0c;不过经过我3个小时的奋斗终于安装成功了。这是我安装Visual Studio 2008过程中遇到的最复杂的一次。 下面我用图解的方式&#xff0c;一步一步的说明安装Visual Studio2008的过程。 第一步&#xff1a;因为win…

[SDK文档]SDK简介

文档链接&#xff1a;https://docs.growingio.com/docs/sdk-integration SDK工作方式 主要内容&#xff1a;GIO采集内容&#xff0c;数据安全措施&#xff0c;针对数据采集的控制项 JS SDK 添加GIO跟踪代码于<head>...</head> 之间异步加载&#xff0c;不影响网…

mysql主从库配置ps:mysql5.6

1 Mysql cluster版本主从服务器搭建实践 主从的作用&#xff1a;MySQL的主从服务器可以满足同步数据库&#xff0c;同步表&#xff0c;同步表内容&#xff0c;也可以指定仅同步某个数据库或某个表&#xff0c;还可以排除不同步某个数据库某个表。 同步原理&#xff1a;主从数据…