DanmakuKit是一个高性能弹幕框架,提供了弹幕相关的基础功能。它提供了一系列操作能够允许你通过cellModel来生成弹幕,并且每个弹幕都支持同步或异步渲染。
如下GIF所示,DanmakuKit提供三种类型的弹幕:悬浮、置顶和置地。
- 速度调节
- 轨道高度调节
- 显示区域调节
- 点击回调
- 暂停和播放单条弹幕
- 弹幕重叠或非重叠状态
- 针对不同类型的轨道禁用弹幕
- 设置弹幕播放进度
- 清理所有弹幕
- Gif弹幕
- SwiftUI
- 实现一个从DanmakuCellModel继承的cellModel。在这个cellModel中需要添加自己的属性和方法来画出弹幕。
class DanmakuTextCellModel: DanmakuCellModel {
var identifier = ""
var text = ""
var font = UIFont.systemFont(ofSize: 15)
var offsetTime: TimeInterval = 0
var cellClass: DanmakuCell.Type {
return DanmakuTextCell.self
}
var size: CGSize = .zero
var track: UInt?
var displayTime: Double = 8
var type: DanmakuCellType = .floating
var isPause = false
func calculateSize() {
size = NSString(string: text).boundingRect(with: CGSize(width: CGFloat(Float.infinity
), height: 20), options: [.usesFontLeading, .usesLineFragmentOrigin], attributes: [.font: font], context: nil).size
}
func isEqual(to cellModel: DanmakuCellModel) -> Bool {
return identifier == cellModel.identifier
}
}
- 实现一个继承DanmakuCell的View。接着实现
displaying
方法,并使用CGContext来绘制弹幕。需要注意的是,displaying
方法的调用并不会在主线程,所以你需要考虑多线程问题。
class DanmakuTextCell: DanmakuCell {
required init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .clear
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func displaying(_ context: CGContext, _ size: CGSize, _ isCancelled: Bool) {
guard let model = model as? DanmakuTextCellModel else { return }
let text = NSString(string: model.text)
context.setLineWidth(1)
context.setLineJoin(.round)
context.setStrokeColor(UIColor.white.cgColor)
context.saveGState()
context.setTextDrawingMode(.stroke)
let attributes: [NSAttributedString.Key: Any] = [.font: model.font, .foregroundColor: UIColor.white]
text.draw(at: .zero, withAttributes: attributes)
context.restoreGState()
context.setTextDrawingMode(.fill)
text.draw(at: .zero, withAttributes: attributes)
}
}
- 给DanmakuView传DanmakuCellModel来显示弹幕。
let danmakuView = DanmakuView(frame: CGRect(x: 0, y: 0, width: 350, height: 250))
view.addSubview(danmakuView)
let cellModel = DanmakuTextCellModel(json: nil)
cellModel.displayTime = displayTime
cellModel.text = contents[index]
cellModel.identifier = String(arc4random())
cellModel.calculateSize()
cellModel.type = .floating
danmakuView.shoot(danmaku: cellModel)
调用play()方法开始显示弹幕。
danmakuView.play()
调用pause()方法暂停弹幕播放。
danmakuView.pause()
调用stop()方法来停止展示弹幕并清理资源。与DanmakuKit相关的内存在该方法调用前不会释放。该方法会在DanmakuView销毁时调用。
danmakuView.stop()
如果想要在弹幕上展示Gif,可以引入Gif subspec并使用DanmakuGifCell和DanmakuGifCellModel。
查看Example工程来了解更多功能。
swift 5.0+
iOS 10.0+, SwiftUI iOS 14.0+
DanmakuKit通过CocoaPods安装。添加如下代码到你的Podfile文件中即可安装。
pod 'DanmakuKit', '~> 1.5.0'
DanmakuKit也支持通过Swift Package Manager. 添加如下代码到你的Package.Swift即可安装:
dependencies: [
.package(url: "https://github.com/qyz777/DanmakuKit.git", from: "1.5.0"),
],
targets: [
.target( name: "YourTarget", dependencies: ["DanmakuKit"]),
]
DanmakuKit使用MIT许可证,请查看LICENSE文件了解更多信息。