項目首頁: DanmuManager Github Repositorygit
DanmuManager
和 VideoDanmuManager
有不一樣的應用場景,後者用於視頻彈幕。github
你能夠運行項目中的測試,來了解兩者的使用方法。dom
建立 DanmuManageride
let dm = DanmuManager(with: self.view)
初始化 init
方法容許自定義:學習
top
、bottom
彈幕顯示在 view
中的上下位置範圍;測試
speed
彈幕的速度;字體
customFont
彈幕字體(UIFont
, 包括字體家族和大小,默認爲系統字體,字號 20)。spa
添加一條彈幕設計
dm.add(with: 「Wow so cool!!!」, at: 4)
添加彈幕 add
方法有兩個必傳參數,text
(彈幕文字) 和 line
(彈幕所在行);可選參數 hasBorder
用於設置該條彈幕是否有邊框(默認 borderColor = UIColor.black.cgColor,borderWidth = 1),默認值爲 false;可選參數 isAdvance
用於設置該條彈幕是否開啓高級功能(目前支持修改 文字顏色 和 背景顏色),默認值爲 false。rest
若是須要彈幕出如今隨機行,可使用
func addRandom(with text: String = "This is a test Danmu.", at line: Int = 0, hasBorder: Bool = false, isAdvanced: Bool = false)`。
暫停/繼續 彈幕
dm.pause() dm.resume()
你也可使用 dm.toggle()
來快捷切換 暫停/繼續。
建立 VideoDanmuManager
let vdm = VideoDanmuManager(view: self.view, videoLength: 10, danmuData: [ (3.4, "3.4 Wowowowowowow!"), (3.4, "3.4 SOOOO COOOOOOOOOOL!"), (3.4, "3.4 Amazing!!!!"), (3.4, "3.4 I love you~"), (3.4, "3.4 MY BABY!!!!"), (1.1, "1.1 This is a test Danmu!!!"), (2.0, "2.0 Another test Danmu."), (4.1, "4.1 Amazing!!!!"), (6.1, "6.1 Test!!!!"), (8.1, "8.1 Test!!!!"), (9.1, "9.1 Test!!!!"), (10, "10 Test!!!!"), ], isSorted: false )
VideoDanmuManager
的建立有三個必選參數,view
(顯示彈幕的視圖),videoLength
(視頻時長,精確到 0.1 秒)和 danmuData
(已經存在的彈幕列表)。
可選參數 videoCurrent
默認爲 0,即開始時刻;你能夠經過傳入不一樣的時間值來設置顯示彈幕的初始時間(好比在視頻從 1 分 15 秒開始播放,則應設置 videoCurrent
爲 75)。
可選參數 isSorted
默認爲 true,即默認數據集已經按照彈幕顯示時間從先到後排序;如傳入 false,則將自動調用 func sort()
對數據進行排序。
可選參數 top
和 bottom
同 DanmuManager
。
開啓彈幕
vdm.start()
你須要在視頻開始播放的同時,手動開啓彈幕。
暫停/繼續 彈幕
vdm.pause() vdm.resume()
你也可使用 vdm.toggle()
來快捷切換 暫停/繼續。
停止彈幕
vdm.stop()
從新開始彈幕
vdm.restart()
你也能夠在指定時間點從新開始彈幕:
vdm.restart(at: 75)
DanmuManager
經過設置的字體大小計算文本顯示高度 lineHeight
,經過 numberOfLines = Int(floor((bottom - top) / lineHeight))
獲得能夠顯示的彈幕行數;使用 inUsingLines
,enteringTimers
和 waitingQueues
來分別記錄 正在使用的行(有尾部尚未徹底進入視圖的彈幕的行),正在進入視圖的彈幕的計時器 和 正在等待進入的彈幕隊列。
爲了防止彈幕重疊,只有當 當前行中前一條彈幕尾部進入視圖 時(以後),下一條彈幕才能夠發射。
enteringTimers
中每個 Timer 都對應一條正在進入視圖的彈幕,當計時器結束時,經過 NotificationCenter 發通知將該彈幕所在的行的狀態更改成 false。
由於彈幕存在暫停狀態,若是彈幕對應的 Timer 不一樣時暫停,將致使 彈幕所在行狀態 提早更改成 false。爲了解決這個問題,我參考他人的想法並改進後建立了 PauseableTimer,並在本項目中使用上了。個人另一篇博客更詳細地介紹了 [PauseableTimer]()。
爲了不手動發射彈幕和自動發射隊列中的彈幕出現衝突(彈幕重疊),全部彈幕經過 taskTimer
定時任務統一調度。
如今流行的彈幕功能愈來愈複雜、高級,DanmuManager 只是完成了最基礎的滾動文字彈幕功能。將來可能會學習常見的彈幕,添加一些更高級的功能,好比 對滾動彈幕的操做,居中彈幕 等。