登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

弹幕控件

[复制链接]
Tag:弹幕 UIview 视图布局 Layout 视图效果

项目介绍:

MMDanmakuDemo

前言

其实在github上已经有了很优秀的弹幕开源控件HJDanmaku,那为什么要重复造轮子呢?

主要考虑到以下方面:
1.重用机制。
2.弹幕的点击响应。

如何实现点击效果

我们知道一部电影的弹幕可能有千千万条,我想你肯定不想初始化那么多视图,所以重用机制是非常必要性的。至于弹幕的点击响应,你可能尝试过在视图动画的时候为UIview添加手势或者直接调用touchesBegan,但发现并没有什么用。所以我们这里是采用其他的方式实现弹幕的响应:
1.将控制器里面拿到的point点回调给管理类MMDanmakuManger

//设置后会有点击效果
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];  //获取点击内容
CGPoint point = [touch locationInView:self.view];
if (self.manger.tapBlock) {
self.manger.tapBlock(point);
}
}

2.我们在弹幕控件中我们会根据显示的区域(可以根据配置类topMargin,bottomMargin调整显示区域),和每个弹幕的高度eachBulletViewHeight,把显示的区域划分为一条条弹道。管理类会持有displayingDic,来记录每个显示区域每个弹道上的视图。这个时候你需要知道对于视图的presentationLayer 和 layer之间的关系。简单来说就是做UIView frame改变动画,你发现layer只有开始值和结束值,而presentationLayer会持续显示过程值。你可以点击这里来进一步了解之间额关系。然后根据弹道的key来取displayingDic的视图数组,判断该点是否在该视图的presentationLayer frame里面。

控件

控件结构图.png
初始化方式:

MMConfiguration *configuration = [MMConfiguration configurationAimationDuration:8 targetView:self.view restartType:MMDanMakuRestartTypeFromLastState];
self.manger = [[MMDanmakuManger alloc] initWithConfiguration:configuration];
self.manger.dataSource = self;
self.manger.delegate = self;
[self.manger packageData];

设置点击:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];  //获取点击内容
CGPoint point = [touch locationInView:self.view];
if (self.manger.tapBlock) {
self.manger.tapBlock(point);
}
}

协议

包装数据
#pragma mark - MMDanmakuMangerDataSource
- (NSUInteger)numberOfItemsControlleredByDanmakuManger:(MMDanmakuManger *)manger {
return self.dataArr.count;
}

- (MMDanMakuModel *)danmakuManger:(MMDanmakuManger *)manger informationForItem:(NSUInteger)index {
return self.dataArr[index];
}
回调点击效果
#pragma mark - MMDanmakuMangerDelagate
- (void)danmakuManger:(MMDanmakuManger *)manger didSelectedItem:(MMDanMakuModel *)model {
NSLog(@"点击了:%@",model.title);
}

Demo中利用定时器来模仿用户输入追加数据:

[self.manger appendData];

控件效果

手上只有iPhone6 Plus,利用YYkit的检测工具,在大量数据的情况下可以保持60FPS。
效果图.gif
如果你喜欢欢迎like和star

https://github.com/YYWDark/MMDanmakuDemo

code4app

相关源码推荐:

我来说两句
*滑动验证:
所有评论(28)
kengsir 2017-1-16 14:17:26
写的真的很不错
回复
AlonMessi 2017-1-16 14:20:29
相当不错,感谢无私分享精神!
回复
BlueManlove 2017-1-16 14:25:00
内容很好,棒棒哒
回复
hellokenken 2017-1-16 14:27:53
code4app确实是个好地方,必须支持~
回复
littleRed 2017-1-16 14:32:49
写的真的很不错
回复
phoiu 2017-1-16 14:39:06
帮帮顶顶!!
回复
code4app热心网友 2017-1-16 15:32:02
楼主威武啊,Code4App有你更给力!
回复
code4app热心网友 2017-1-16 16:01:49
楼主威武啊,Code4App有你更给力!
回复
code4app热心网友 2017-1-16 19:07:17
楼主威武啊,Code4App有你更给力!
回复
123下一页
提取码:  下载次数:49 状态:已购或VIP 售价:0(原价:10)金钱 下载权限:初级码农 
1366 0 49
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表