目录

  • 前言
  • 效果预览
  • 评论框
    • 列表
    • 添加评论
    • 从下往上显示
    • 支持昵称颜色
    • 给出NSAttributedString
  • 点赞动画

前言

最近做了直播功能,其实难度不是说很大,主要是方案和SDK的选择、整个直播流程的异常处理和优化,还有第三方SDK的填坑。不过本文只是记录下评论框和点赞效果的实现,其他的是用第三方SDK,觉得没什么好分享的,只是了解了直播流程和开发中会遇到的问题。
但看到效果还是蛮激动和蛮有成就感的,这个主要是技术本身带来的。

效果预览

评论框

细化需求:

  • 显示评论内容
  • 从下往上显示
  • 最大支持1000条
  • 不同人昵称显示颜色随机分配,同一个人颜色保持不变。
  • 评论插入有动画

列表

  • 聊天列表类MessageChatView,对外接口add

    func add(message: String) {}
    
  • 存放评论数组

    private let maxMessageCount: Int = 1000
    private var messages: [String] = []
    
  • UITableViewDelegate & UITableViewDataSource

    extension MessageChatView: UITableViewDataSource {func numberOfSectionsInTableView(tableView: UITableView) -> Int {return messages.count}func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return 1}func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {   ...return cell}
    }extension MessageChatView: UITableViewDelegate {func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return ...}func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {return 5.0}
    }
    

此时显示了数组里面的评论,最多1000条。

添加评论

func add(message: String) {messages.insert(message, atIndex: 0)tableView.insertSections(NSIndexSet(index: 0), withRowAnimation: .Top)if messages.count > maxMessageCount {messages.removeLast()tableView.deleteSections(NSIndexSet(index: messages.count), withRowAnimation: .None)}
}

使用UITableView自带的方法可以有动画效果。插入动画使用.Top

从下往上显示

  • iOS在tableView和tableViewCell里调用下面语句:

    tableView.transform = CGAffineTransformMakeScale (1,-1);
    label.transform = CGAffineTransformMakeScale (1,-1);
    

    两条语句就可以实现了。

  • Android可以调用ListView自带的属性stackFromBottom:

    android:stackFromBottom="true"
    

网上有文章将数据 append到数据源,在获取数据源时从后往前读的方式(即messages.count-1-indexPath.section),显然插入在0位置比那样更方便:insert(message, atIndex: 0)

支持昵称颜色

  • 使用NSAttributedString,且由外界设置。messages类型改为NSAttributedString数组。

    private var messages: [NSAttributedString] = []
    
  • add改为NSAttributedString。

    func add(message: NSAttributedString) {}
    
  • 设置Label的时候设置label.attributedText

给出NSAttributedString

  • 一个新的类ChatColorText,对外接口colorText,参数nickName、text。

    func colorText(nickName: String?, text: String?) -> NSAttributedString?{}
    
  • 随机颜色数组。

    private var colors = [UIColor(hex: .RGB00AEFF)!,UIColor(hex: .RGB00A61C)!,UIColor(hex: .RGB5400E6)!,UIColor(hex: .RGBFF3377)!,UIColor(hex: .RGBFF8800)!,UIColor(hex: .RGBFF5E00)!,UIColor(hex: .RGBCA2EE6)!,
    ]
    
  • 记录当前取颜色的Index,使得不同人给不同颜色。

    private var colorIndex: Int = 0
    
  • 记录昵称对应的颜色值,保证同一个昵称同一种颜色。

    private var dicOfNameAndColor = [String: UIColor]()
    
  • 对外接口colorText实现。

    func colorText(nickName: String?, text: String?) -> NSAttributedString? {guard let nickName = nickName, text = text else {return nil}let nickNameColor: UIColor = {if let color = dicOfNameAndColor[nickName] {return color}else {let color = colors[colorIndex]dicOfNameAndColor[nickName] = colorcolorIndex = (colorIndex + 1) % colors.countreturn color}}()let attributedString = NSAttributedString.attributedStringWithTextsAndColors([nickName, text], colors: [nickNameColor, UIColor(hex: .RGB333333)!])return attributedString
    }
    

    NSAttributedString.attributedStringWithTextsAndColors是自己扩展的一个方法,传入多串文字和对应的字符返回匹配的NSAttributedString。

    主要逻辑是:先判断是否已经有保存过昵称对应的颜色值,有则直接返回;没有则根据index获取颜色值,然后保存起来,并改变index。

点赞动画

iOS自带了粒子引擎的类CAEmitterLayer,是一个粒子发射器系统,每个粒子都是CAEmitterCell的实例。可以查看它们分别有什么属性。

有两个小点,一个是CAEmitterLayer一些属性对CAEmitterCell有成倍作用,如birthRate;另一个是没有明确的停止动画的方法,包括它的父类也没提供。可以想到的方法,除了把layer抹除掉之外,还可以将CAEmitterLayerbirthRate设置为0,这样每个CAEmitterCell的诞生速率都为0,就不会有动画了。


class PraiseEmitterView: UIView {private var timer: NSTimer?private let emitter: CAEmitterLayer! = {let emitter = CAEmitterLayer()return emitter}()override init(frame: CGRect) {super.init(frame: frame)setup()}required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)setup()}private func setup() {emitter.frame = boundsemitter.birthRate = 0emitter.emitterShape = kCAEmitterLayerLineemitter.emitterPosition = CGPointMake(0,CGRectGetHeight(bounds))emitter.emitterSize = bounds.sizeemitter.emitterCells = [getEmitterCell(UIImage(named: "comment")!.CGImage!), getEmitterCell(UIImage(named: "flower_15")!.CGImage!)]self.layer.addSublayer(emitter)}func timeoutSelector() {emitter.birthRate = 0}func emit() {emitter.birthRate = 2timer?.invalidate()timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: #selector(timeoutSelector), userInfo: nil, repeats: false)}private func getEmitterCell(contentImage: CGImage) -> CAEmitterCell {let emitterCell = CAEmitterCell()emitterCell.contents = contentImageemitterCell.lifetime = 2emitterCell.birthRate = 2emitterCell.yAcceleration = -70.0emitterCell.xAcceleration = 0emitterCell.velocity = 20.0emitterCell.velocityRange = 200.0emitterCell.emissionLongitude = CGFloat(0)emitterCell.emissionRange = CGFloat(M_PI_4)emitterCell.scale = 0.8emitterCell.scaleRange = 0.8emitterCell.scaleSpeed = -0.15emitterCell.alphaRange = 0.75emitterCell.alphaSpeed = -0.15return emitterCell}
}

别外一篇类似的文章可参考并附有demo : 《iOS:直播动态评论和点赞效果》

iOS直播:评论框与粒子系统点赞动画相关推荐

  1. html5点赞仿抖音,iOS仿抖音—加载点赞动画效果

    iOS仿抖音短视频 前言 前段时间比较忙,最近终于有时间就继续对仿抖音的demo进行更新,本次更新的主要是抖音上的几种动画,下面先来看下效果图: 抖音 说明 经过观察发现抖音主要要以下几种动画效果: ...

  2. iOS 直播心形点赞动画

    iOS 直播心形点赞动画 https://github.com/KKKiller/KKHeartFlyAnimation

  3. ios 直播间点赞动画

    直播间点赞动画 #pragma mark - 点赞动画 - (void)praiseAnimation {       UIImageView *imageView = [[UIImageView a ...

  4. android炫酷动画代码,Android高级UI特效仿直播点赞动画效果

    Android高级UI特效仿直播点赞动画效果 发布时间:2020-10-02 16:06:18 来源:脚本之家 阅读:117 作者:mrr 本文给大家分享高级UI特效仿直播点赞效果-一个优美炫酷的点赞 ...

  5. html直播动画,HTML5 直播疯狂点赞动画实现代码 附源码

    直播有一个很重要的互动: 为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞通常有两个特殊需求: 点赞动作无限次,引导用户疯狂点赞 直播间的所有疯狂点赞,都需要在所有用户界面都 我们先来看效果 ...

  6. H5 直播的疯狂点赞动画是如何实现的?(附完整源码)

    直播有一个很重要的互动:点赞. 为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞通常有两个特殊需求: 点赞动作无限次,引导用户疯狂点赞 直播间的所有疯狂点赞,都需要在所有用户界面都动画展现出 ...

  7. iOS仿抖音点赞动画、波浪图、主张图、3D旋转、图片处理、播放器等源码

    iOS精选源码 iOS 一个异步渲染TextKit 写个女朋友的生日礼物codeGift 3D旋转 仿抖音小视频点赞动画 高德地图SDK二次封装,完美适配iOS11. iOS图表二次定制 - 波浪折线 ...

  8. H5 直播的疯狂点赞动画如何通过php直播平台源码实现(附完整源码)

    php直播平台源码H5 直播的疯狂点赞动画如何通过php直播平台源码实现(附完整源码) 直播有一个很重要的互动:点赞. 为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞通常有两个特殊需求: ...

  9. css3宽度变大动画_H5 直播的疯狂点赞动画是如何实现的?

    直播有一个很重要的互动:点赞. 为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞通常有两个特殊需求: 点赞动作无限次,引导用户疯狂点赞 直播间的所有疯狂点赞,都需要在所有用户界面都动画展现出 ...

最新文章

  1. Excel VBA参考文献中人名与年份格式转换
  2. Eclipse闪退/打不开/无法启动/一闪而过
  3. 任务中断间的同步与通信概述
  4. 算法工程师如何改进豆瓣电影
  5. QT在windows平台安装使用MInGW编译
  6. 第一个SpringMVC入门程序
  7. Centos 搭建activemq
  8. Android开机自启动 .
  9. 电源模块怎么选?以下6点你都知道吗?
  10. 轻量级java开发工具_C++主流开发工具推荐
  11. dts : rx8025t与lm75bd
  12. 微信推广营销--如何提高微信订阅号的图文转化率?
  13. 数学归纳法·Fibonacci数列
  14. 摄像头视频捕捉(IsampleGrabberCB实现)
  15. 万网域名查询是否注册接口
  16. InfluxDB中Line Protocol理解
  17. go vender 的环境搭建和使用
  18. VMware虚拟机安装MAC OS原版系统,轻松体验苹果操作系统
  19. php获取视频信息,支持优酷土豆新浪腾讯等多家网站
  20. 深入理解立即数与直接寻址

热门文章

  1. 程序员的一天:硅谷女程序员 mayuko
  2. 金华驾驶员考试中心 科目二、科目三和科目四
  3. 由Table_locks_waited想到的mysql 表锁问题
  4. Java-常用实现分页查询
  5. UnityShader入门精要——运动模糊
  6. 产品三维展示|3D可视化解决方案|产品3D个性化定制案例分享
  7. select 多选下拉框获取值
  8. 旷世巨作!20 多位架构师携手打造的“Java 面试核心宝典”限时开源
  9. 第07章 文本信息提取
  10. vRealize Operations Manager 仪表板示图