最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IOS 實(shí)現(xiàn)簡(jiǎn)單的彈幕功能

 更新時(shí)間:2016年07月22日 11:47:56   投稿:lqh  
本文主要介紹IOS 實(shí)現(xiàn)彈幕功能,這里給大家一個(gè)實(shí)例來展現(xiàn)彈幕功能,有需要的小伙伴可以參考下

前言

  簡(jiǎn)單實(shí)現(xiàn)彈幕功能,表跟我談效率,但也有用隊(duì)列控制同時(shí)彈的數(shù)量。

正文

         代碼實(shí)現(xiàn):

let DANMAKU_SPEED: CGFloat = 150 // 彈幕每秒移動(dòng)速度
 let DANMAKU_SPACE_TIME: NSTimeInterval = 1 // 彈幕之間的時(shí)間間隔
 let DANMAKU_MAX_ROW = 3 // 最多同時(shí)彈幕行數(shù)
 let danmakuFont = UIFont.systemFontOfSize(18) // 彈幕字體大小
 var rowArray = Array<Array<Danmaku>>(count: 3, repeatedValue: Array<Danmaku>()) 
 var danmakuQueue = NSOperationQueue() // 隊(duì)列

 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 {
     //檢測(cè)放第幾行
     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()
  }
 }

代碼說明:

  代碼控制了最多同時(shí)只能彈三行,每行最后一條如果延遲大于跑彈幕的時(shí)間(已經(jīng)有一條處于完全等待狀態(tài))就自動(dòng)切到下一行,超過最大限制就等待。

      *  rowArray 主要用于查詢前一個(gè)彈幕的位置和時(shí)間

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

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

以上就是對(duì)IOS開發(fā) 簡(jiǎn)單的彈幕功能的實(shí)現(xiàn)代碼,有需要開發(fā)這種功能的朋友可以參考下。

相關(guān)文章

  • Swift心得筆記之控制流

    Swift心得筆記之控制流

    控制流(Control Flow)我不想這么譯的。。。我更想叫控制語句,但是想想,這么叫也沒錯(cuò),意指流程控制。大部分用法跟C類似。
    2015-04-04
  • iOS開發(fā)中Swift 指紋驗(yàn)證功能模塊實(shí)例代碼

    iOS開發(fā)中Swift 指紋驗(yàn)證功能模塊實(shí)例代碼

    本文給大家分享ios調(diào)用touchid代碼塊,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下把
    2017-03-03
  • swift3.0指紋解鎖的實(shí)現(xiàn)方法

    swift3.0指紋解鎖的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了swift3.0指紋解鎖的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Swift實(shí)現(xiàn)表格視圖單元格多選

    Swift實(shí)現(xiàn)表格視圖單元格多選

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)表格視圖單元格多選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift教程之枚舉類型詳解

    Swift教程之枚舉類型詳解

    這篇文章主要介紹了Swift教程之枚舉類型詳解,本文講解了枚舉語法、匹配枚舉值與switch語句、關(guān)聯(lián)值、原始值等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • swift 字符串String的使用方法

    swift 字符串String的使用方法

    這篇文章主要介紹了swift 字符串String的使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理詳解

    Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理詳解

    這篇文章主要給大家介紹了關(guān)于Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Swift中通過疊加UILabel實(shí)現(xiàn)混合進(jìn)度條的方法

    Swift中通過疊加UILabel實(shí)現(xiàn)混合進(jìn)度條的方法

    這篇文章主要介紹了Swift中通過疊加UILabel實(shí)現(xiàn)混合進(jìn)度條的方法的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目

    Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift之UITabBarController 導(dǎo)航控制器的自定義

    Swift之UITabBarController 導(dǎo)航控制器的自定義

    本文給大家介紹swift導(dǎo)航控制器之UITabBarController,本文通過代碼實(shí)例給大家講解swift導(dǎo)航控制器,導(dǎo)航控制器類繼承UITabBarController,代碼簡(jiǎn)單易懂,需要的朋友可以參考下
    2015-10-10

最新評(píng)論

佳木斯市| 保德县| 邯郸县| 水城县| 中卫市| 许昌市| 沙坪坝区| 华安县| 屏东市| 山东省| 兴业县| 湄潭县| 道孚县| 夹江县| 淮滨县| 瑞金市| 龙川县| 韶山市| 永兴县| 长春市| 凤山市| 仪陇县| 隆回县| 新巴尔虎左旗| 固阳县| 田林县| 阿荣旗| 永德县| 鄂州市| 米脂县| 固始县| 阿坝| 贡嘎县| 上思县| 蒙自县| 江华| 辽源市| 云梦县| 安仁县| 石河子市| 南川市|