event
在gic
中也是以behavior
实现的,event
的基类是GICEvent
,这个类是gic
对事件的封装,事件有很多种,点击、触摸、双击等一些手势事件固然也算是事件,而下拉刷新、属性变更等其实也算是事件,因此gic
中事件是泛指。
在gic
中,如无必要,你也无需自定义一个event class,直接使用GICEvent
即可。
GICEvent
在设计的时候考虑到了多播事件的情况,因此在实现的时候是基于RAC
来实现的。GICEvent
的定义如下:
1 | @interface GICEvent : GICBehavior{ |
GICEvent
有两个属性,eventSubject
在这里权当是一个多播事件,你可以在同一个事件上注册多个订阅者,只需要调用eventSubject
的subscribeNext
方法就能订阅事件。如果要触发一个事件,那么直接调用GICEvent
的fire
方法即可。
而initWithExpresion
方法,是用来在XML中绑定事件用的,expresion就是绑定事件回调的方法名称,如果回调方法需要接受事件上下文,那么你就需要在方法后面添加一个:
,其实之所以这样实现,完全是因为GICEvent
在实现的 时候是通过NSSelectorFromString
方法来创建事件回调的。
对于绑定是事件回调来说,回调必须在该元素的数据源上下文中,也就是某个ViewModel
中,GICEvent
在查找事件回调target的时候,会按照数据源逐级往上查找,当找到最近的一个数据源实现了该绑定的方法,那么就直接回调,不会再往上查找了。
目前所有的UI元素支持如下事件:
event-tap
单击事件
event-double-tap
双击事件
event-touch-begin
触摸开始事件
event-touch-move
触摸事件
event-touch-end
触摸结束事件
不同的元素可能提供不同的事件,具体的可以查看对应元素的文档。
所有的事件都可以通过eventInfo来访问。
如果是在JS
中访问,可以通过$eventInfo
来访问。比如:点击事件获取point
参数
1 | <lable text="触摸事件。摸我" event-touch-move="js:$el.text='('+$eventInfo.x+','+$eventInfo.y+')';" /> |
上面$eventInfo
表示的是由GIC
传来的CGPoint
,可以直接通过属性x,y
访问。
convertPoint
& convertRect
两个方式是提供给JS使用的,用来将某个点转换到另外一个view上面。具体的可以参考sample中的示例。
下面提供convertPoint
的代码示例。
1 | <lable text="触摸事件。" event-touch-move="js:convertPoint($el,$eventInfo)"> |