Rive 事件
⚠️ 警告:此功能已弃用,仅支持旧版运行时,不支持当前运行时。请改用数据绑定来替代事件。
概览
Rive 事件允许你在编辑器中定义事件,并在运行时通过代理方法接收这些事件。事件可以是通用事件(携带自定义属性)或打开 URL 事件。
通过状态机代理订阅事件
要订阅 Rive 事件,请实现 StateMachineDelegate 中的 onRiveEventReceived 协议。
@objc optional func onRiveEventReceived(onRiveEvent riveEvent: RiveEvent)
当 Rive 事件从渲染循环触发时,此实现可能被调用,并提供一个通用的 RiveEvent 数 据类型。你可以进行类型检查以转换为特定事件进行进一步解析,例如 RiveGeneralEvent 或 RiveOpenUrlEvent。
例如:
@objc func onRiveEventReceived(onRiveEvent riveEvent: RiveEvent) {
debugPrint("Event Name: \(riveEvent.name())")
debugPrint("Event Type: \(riveEvent.type())")
if let openUrlEvent = riveEvent as? RiveOpenUrlEvent {
// 例如,打开 URL
} else if let generalEvent = riveEvent as? RiveGeneralEvent {
// 例如,打印 Text 组件中提供的字符串数据
}
}
注意: 类型为
RiveOpenUrlEvent的事件不会自动在用户首选浏览器中打开链接。你需要添加逻辑来获取传入代理的riveEvent的url属性并打开链接。
示例用法
import SwiftUI
import RiveRuntime
struct SwiftEvents: DismissableView {
var dismiss: () -> Void = {}
@StateObject private var rvm = RiveEventsVMExample()
var body: some View {
VStack {
rvm.view()
Text("Event Message")
.font(.headline)
.padding(.bottom, 10)
Text(rvm.eventText)
.padding()
.background(rvm.eventText.isEmpty ? Color.clear : Color.black)
.foregroundColor(.white)
.cornerRadius(10)
}
}
}
class RiveEventsVMExample: RiveViewModel {
@Published var eventText = ""
init() {
super.init(fileName: "rating_animation")
}
func view() -> some View {
return super.view().frame(width: 400, height: 400, alignment: .center)
}
// 订阅 Rive 事件,此代理将被调用
@objc func onRiveEventReceived(onRiveEvent riveEvent: RiveEvent) {
if let openUrlEvent = riveEvent as? RiveOpenUrlEvent {
if let url = URL(string: openUrlEvent.url()) {
#if os(iOS)
UIApplication.shared.open(url)
#else
NSWorkspace.shared.open(url)
#endif
}
} else if let generalEvent = riveEvent as? RiveGeneralEvent {
let genEventProperties = generalEvent.properties();
if let msg = genEventProperties["message"] {
eventText = msg as! String
}
}
}
}
其他资源
有关 Rive 事件系统的更多信息,请参见 Rive 编辑器文档。