亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
66m—66摸成人免费视频| 久久久www成人免费精品| 91国内免费在线视频| 精品国产鲁一鲁一区二区张丽| 日韩精品极品视频免费观看| 亚洲电影免费观看高清完整版在线| 国产在线拍偷自揄拍精品| 欧美日韩亚洲精品内裤| 日本高清+成人网在线观看| 亚洲黄在线观看| 亚洲视频综合网| 精品国产美女在线| 欧美日本中文字幕| 91精品国产综合久久香蕉的用户体验| 欧美性高跟鞋xxxxhd| 久久久综合av| 欧美视频专区一二在线观看| 久久精品最新地址| www.日韩系列| 精品动漫一区二区三区| www日韩中文字幕在线看| 国产日韩欧美日韩| 欧美www在线| 久久久久久久91| 成人在线视频网站| 日韩欧美亚洲成人| 亚洲va欧美va国产综合剧情| 日韩免费精品视频| 欧美理论片在线观看| 欧美在线精品免播放器视频| 精品久久久久久久中文字幕| 青青久久aⅴ北条麻妃| 欧美一区二区三区四区在线| 福利精品视频在线| 欧美激情精品久久久久久蜜臀| 性色av一区二区三区免费| 国产精品自拍偷拍视频| 中文字幕亚洲第一| 国产在线观看一区二区三区| 九九热最新视频//这里只有精品| 日本电影亚洲天堂| 亚洲男人第一av网站| 亚洲色图17p| 精品福利樱桃av导航| 九九热精品视频国产| 日韩精品有码在线观看| 亚洲成人国产精品| 欧美日韩成人在线播放| 亚洲精品国产精品乱码不99按摩| 日韩精品中文字幕有码专区| 国语自产精品视频在线看抢先版图片| 国产欧美日韩专区发布| 一本色道久久综合狠狠躁篇的优点| 日韩在线观看精品| 97**国产露脸精品国产| 亚洲wwwav| 国产一区二区视频在线观看| 91精品在线影院| 欧美精品在线第一页| 欧美视频国产精品| 日韩国产精品亚洲а∨天堂免| 色婷婷成人综合| 欧美精品免费在线观看| 欧美精品一本久久男人的天堂| 国产成人在线亚洲欧美| 成人精品福利视频| 欧美孕妇毛茸茸xxxx| 日韩在线观看精品| 亚洲精品久久久久| 久久不射电影网| 久久成人精品视频| 深夜福利国产精品| 午夜精品蜜臀一区二区三区免费| 欧美精品videosex极品1| 色综合男人天堂| 欧美精品久久久久a| 深夜福利日韩在线看| 日韩欧中文字幕| 成人欧美一区二区三区在线湿哒哒| 久久精品一区中文字幕| wwwwwwww亚洲| 成人国产精品一区二区| xvideos亚洲| 久久精品视频网站| 91久久在线播放| 亚洲欧美成人一区二区在线电影| 青青久久aⅴ北条麻妃| 国产自产女人91一区在线观看| 久久免费少妇高潮久久精品99| 成人在线免费观看视视频| 国产日本欧美一区二区三区在线| 日韩欧美国产黄色| 欧美性猛交xxx| 欧美成人在线影院| 亚州成人av在线| 久久高清视频免费| 国产精品成人一区| 中文字幕精品—区二区| 亚洲高清在线观看| 国产精品久久激情| 色综合视频网站| 91久久精品国产91久久性色| 国产精品日韩精品| 日韩国产欧美精品在线| 91综合免费在线| 久久99精品久久久久久青青91| 欧美一性一乱一交一视频| 97色在线播放视频| 日韩欧美一区视频| 91香蕉嫩草神马影院在线观看| 国产精品尤物福利片在线观看| 欧美成人手机在线| 亚洲人成绝费网站色www| 成人免费淫片视频软件| 欧美精品情趣视频| 午夜精品福利在线观看| 亚洲免费视频一区二区| 91最新国产视频| 亚洲欧洲中文天堂| 久久免费少妇高潮久久精品99| 久久天天躁夜夜躁狠狠躁2022| 91香蕉嫩草神马影院在线观看| 精品国产视频在线| 久久最新资源网| 91精品在线播放| 国产91|九色| 中文日韩在线视频| 狠狠色噜噜狠狠狠狠97| 欧美性感美女h网站在线观看免费| 国产精品高清网站| 国产97在线视频| 亚洲第一中文字幕在线观看| 97视频在线观看亚洲| 国语自产在线不卡| 欧洲成人在线观看| 国产精品久久久久9999| 一区二区三区视频免费| 久久黄色av网站| 日韩成人av在线| 国产精品久久久久久久久久久久| 亚洲精品黄网在线观看| 亚洲精品福利在线观看| 精品国产91久久久久久老师| 亚洲视频一区二区三区| 国产精品羞羞答答| 国产伦精品免费视频| 清纯唯美亚洲激情| 国产精品久久电影观看| 亚洲激情电影中文字幕| 在线观看精品自拍私拍| 中国china体内裑精亚洲片| 久久手机精品视频| 96pao国产成视频永久免费| 欧美日韩中文字幕日韩欧美| 国产精品丝袜久久久久久不卡| 日韩在线一区二区三区免费视频| 国产小视频91| 中文字幕欧美日韩va免费视频| 久久视频这里只有精品| 久久精品国产精品亚洲| 色婷婷av一区二区三区久久| 国产精品直播网红| 中文字幕在线亚洲| 亚洲欧美综合区自拍另类|