IOS中得控件,大家并不陌生。那么如何来自定义一个控件呢,对于纯粹的显示类的控件我们在这里不再赘述,只是说一下自定义控件,如何响应点击消息。
一、UIControl中的触摸事件响应函数
自定义一个控件,如果是需要响应点击消息、拖动消息,大多是直接继承自UIControl,在不熟悉下面所要讲的东西之前,一直是自己写手势判断来响应,然后发现... ...后面的都不说了,一切都是泪啊!
二、Target-Action模式
在可以响应触摸事件之后,就会如何使其调用我们的自定义方法了。在了解这个模式之前,都是一直在用“protocol”来做... ...好了,一切不说从前。
见如下代码:
// 添加一个 target/action 注册事件及其响应
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
// 移除一个 target/action 注销事件及其响应
- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
// 获取所有 target/action 的 target 对象
- (NSSet *)allTargets;
// 获取所有要响应的 UIControlEvents
- (UIControlEvents)allControlEvents;
// 获取指定target和UIControlEvents的action的方法名,target不能为nil
- (NSArray *)actionsForTarget:(id)target forControlEvent:(UIControlEvents)controlEvent;
// 调用指定的 target/action,第三个参数作用未知
- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event;
// 发送一个事件,使触发对应的 target/action 可以指定自定义事件
- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents;
使用,标为红色的两个方法,我们就可以实现自定义方法的处理。
下列事件为基类UIControl所支持,除非另有说明,也适用于所有控件。
UIControlEventTouchDown // 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。
UIControlEventTouchDownRepeat // 多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。
UIControlEventTouchDragInside //当一次触摸在控件窗口内拖动时。
UIControlEventTouchDragOutside //当一次触摸在控件窗口之外拖动时。
UIControlEventTouchDragEnter //当一次触摸从控件窗口之外拖动到内部时。
UIControlEventTouchDragExit //当一次触摸从控件窗口内部拖动到外部时。
UIControlEventTouchUpInside //所有在控件之内触摸抬起事件。
UIControlEventTouchUpOutside //所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。
UIControlEventTouchCancel //所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。
UIControlEventTouchChanged //当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。
UIControlEventEditingDidBegin //当文本控件中开始编辑时发送通知。
UIControlEventEditingChanged //当文本控件中的文本被改变时发送通知。
UIControlEventEditingDidEnd //当文本控件中编辑结束时发送通知。
UIControlEventEditingDidOnExit //当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。
UIControlEventAlltouchEvents //通知所有触摸事件。
UIControlEventAllEditingEvents //通知所有关于文本编辑的事件。
UIControlEventAllEvents //通知所有事件。