麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Swift > 正文

IOS 實現簡單的彈幕功能

2020-03-09 17:47:49
字體:
來源:轉載
供稿:網友

前言

  簡單實現彈幕功能,表跟我談效率,但也有用隊列控制同時彈的數量。

正文

         代碼實現:

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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品久久久久久久久久 | 国产一国产一级毛片视频在线 | 亚洲亚色| 国产亚洲福利 | 久久逼网 | 日本中文字幕网址 | 亚洲成人国产 | 久久成人国产精品 | 国产免费一区二区三区 | 精品一区二区三区免费看 | 精品久久久av | 在线高清中文字幕 | 1级片在线观看 | 日韩在线毛片 | 国产一区在线观看视频 | 亚洲网站在线播放 | 欧美一级片免费在线观看 | 91成人影院 | 精品国产一区二区三区四区阿崩 | 黄色片网站免费看 | 日韩黄色免费观看 | 一区二区国产在线 | www.91sp| 91精品久久香蕉国产线看观看 | 手机国产乱子伦精品视频 | 久综合色| 精品一区二区久久久久久按摩 | 四虎久草| 色羞羞 | 久久亚洲国产精品 | 国产国语毛片 | 国产精品久久久久久久久久10秀 | 777午夜精品视频在线播放 | 最近免费观看高清韩国日本大全 | 亚洲码无人客一区二区三区 | 黄色大片免费看 | 少妇一级淫片免费放播放 | 精品久久久久久久久中文字幕 | 毛片a区 | 草草视频免费观看 | 欧美一级无毛 |