IOS 实现简单的弹幕功能

 更新时间:2016年07月22日 11:47:56   投稿:lqh  
本文主要介绍IOS 实现弹幕功能,这里给大家一个实例来展现弹幕功能,有需要的小伙伴可以参考下

前言

  简单实现弹幕功能,表跟我谈效率,但也有用队列控制同时弹的数量。

正文

         代码实现:

let DANMAKU_SPEED: CGFloat = 150 // 弹幕每秒移动速度
 let DANMAKU_SPACE_TIME: NSTimeInterval = 1 // 弹幕之间的时间间隔
 let DANMAKU_MAX_ROW = 3 // 最多同时弹幕行数
 let danmakuFont = UIFont.systemFontOfSize(18) // 弹幕字体大小
 var rowArray = Array<Array<Danmaku>>(count: 3, repeatedValue: Array<Danmaku>()) 
 var danmakuQueue = NSOperationQueue() // 队列

 class Danmaku : NSObject{
  var msg: Msg
  var view: UILabel?
  var size = CGSize(width: 0, height: 0)
  var row = 0
  var startTime: NSDate?
  var duration: NSTimeInterval = 0
  var delay: NSTimeInterval = 0
  
  init(_ msg: Msg, _ row: Int, _ delay: NSTimeInterval = 0) {
   self.msg = msg
   self.row = row
   self.delay = delay
  }
 }
 
 func queueDanmaku(msg: Msg) {
  danmakuQueue.addOperation(NSBlockOperation(block: { [weak self] in

   if let weakself = self {
    repeat {
     //检测放第几行
     for var row = 0; row < weakself.DANMAKU_MAX_ROW; ++row {
      let rowDanmaku = weakself.rowArray[row]
      if rowDanmaku.count == 0 {
       let danmaku = Danmaku(msg, weakself.danmakuFont, row)
       weakself.rowArray[row].append(danmaku)
       self?.performSelectorOnMainThread("sendDanmaku:", withObject: danmaku, waitUntilDone: true)
       return
      } else {
       if let lastDanmaku = rowDanmaku.last {
        if let startTime = lastDanmaku.startTime {
         let now = NSDate()
         let seconds = now.timeIntervalSinceDate(startTime)
         let widthDuration = Double(lastDanmaku.size.width / weakself.DANMAKU_SPEED)
         
         var delay = seconds - weakself.DANMAKU_SPACE_TIME - widthDuration
         if delay >= 0 {
          delay = 0
         } else {
          if lastDanmaku.delay > lastDanmaku.duration {
           continue
          }
         }
    
         let danmaku = Danmaku(msg, weakself.danmakuFont, row, abs(delay) + lastDanmaku.delay)
         weakself.rowArray[row].append(danmaku)
         
         self?.performSelectorOnMainThread("sendDanmaku:", withObject: danmaku, waitUntilDone: true)
         return
        }
       }
      }
     }
     
     sleep(1000)
    } while self != nil
   }
   
   }))
 }
 
 func sendDanmaku(danmaku: Danmaku) {
  let text = "\(danmaku.msg.user_name) : \(danmaku.msg.text)"
  let size = NSString(string: text).sizeWithAttributes([NSFontAttributeName : danmakuFont])
  let width = UIScreen.mainScreen().bounds.size.width
  let top = 54 + danmaku.row * (Int(size.height) + 10)
  let label = UILabel(frame: CGRectMake(width, CGFloat(top), size.width, size.height))
  let duration = (width + size.width) / DANMAKU_SPEED

  danmaku.view = label
  danmaku.size = size
  danmaku.startTime = NSDate()
  danmaku.duration = NSTimeInterval(duration)
  
  label.text = text
  label.font = danmakuFont
  label.textColor = UIColor.whiteColor()
  label.shadowColor = UIColor.blackColor()
  label.shadowOffset = CGSizeMake(0, -1.0)
  
  self.view.addSubview(label)
  UIView.animateWithDuration(Double(duration), delay: danmaku.delay, options: UIViewAnimationOptions.CurveLinear, animations: { () -> Void in
    label.left = -label.width
   }) { [weak self] (Bool) -> Void in
    if !(self?.rowArray[danmaku.row].isEmpty ?? true) {
     self?.rowArray[danmaku.row].removeFirst()
    }
    label.removeFromSuperview()
  }
 }

代码说明:

  代码控制了最多同时只能弹三行,每行最后一条如果延迟大于跑弹幕的时间(已经有一条处于完全等待状态)就自动切到下一行,超过最大限制就等待。

      *  rowArray 主要用于查询前一个弹幕的位置和时间

      *  别忘了在 deinit 里面加上 danmakuQueue.cancelAllOperations()

      *  注意 NSBlockOperation 的 block 并不在主线程上

以上就是对IOS开发 简单的弹幕功能的实现代码,有需要开发这种功能的朋友可以参考下。

相关文章

  • Swift心得笔记之控制流

    Swift心得笔记之控制流

    控制流(Control Flow)我不想这么译的。。。我更想叫控制语句,但是想想,这么叫也没错,意指流程控制。大部分用法跟C类似。
    2015-04-04
  • iOS开发中Swift 指纹验证功能模块实例代码

    iOS开发中Swift 指纹验证功能模块实例代码

    本文给大家分享ios调用touchid代码块,非常不错,具有参考借鉴价值,需要的朋友参考下把
    2017-03-03
  • swift3.0指纹解锁的实现方法

    swift3.0指纹解锁的实现方法

    这篇文章主要为大家详细介绍了swift3.0指纹解锁的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Swift实现表格视图单元格多选

    Swift实现表格视图单元格多选

    这篇文章主要为大家详细介绍了Swift实现表格视图单元格多选,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Swift教程之枚举类型详解

    Swift教程之枚举类型详解

    这篇文章主要介绍了Swift教程之枚举类型详解,本文讲解了枚举语法、匹配枚举值与switch语句、关联值、原始值等内容,需要的朋友可以参考下
    2015-01-01
  • swift 字符串String的使用方法

    swift 字符串String的使用方法

    这篇文章主要介绍了swift 字符串String的使用方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • Swift实现监听键盘通知及一些处理详解

    Swift实现监听键盘通知及一些处理详解

    这篇文章主要给大家介绍了关于Swift实现监听键盘通知及一些处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Swift中通过叠加UILabel实现混合进度条的方法

    Swift中通过叠加UILabel实现混合进度条的方法

    这篇文章主要介绍了Swift中通过叠加UILabel实现混合进度条的方法的相关资料,需要的朋友可以参考下
    2016-08-08
  • Swift实现简单计算器项目

    Swift实现简单计算器项目

    这篇文章主要为大家详细介绍了Swift实现简单计算器项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Swift之UITabBarController 导航控制器的自定义

    Swift之UITabBarController 导航控制器的自定义

    本文给大家介绍swift导航控制器之UITabBarController,本文通过代码实例给大家讲解swift导航控制器,导航控制器类继承UITabBarController,代码简单易懂,需要的朋友可以参考下
    2015-10-10

最新评论