UI篇-自定义控件之基类UIControl
2018-01-17 本文已影响0人
進无尽
UIControl的意义所在
UIControl的主要角色是定义一套接口和基础实现,为iOS的人机交互制定了一系列的标准,
为了当确定的事件发生的时候(比如点击了按钮)准备好动作消息(Action)并开始派发它们到自己的目标(Target,eg:UIViewController)。
UIControl是控件的基类,不能直接的实例化,它只能通过继承的方式为子类提供公共的接口和动作结构。
UIControl事件实现原理
- 比如我们有一个按钮,当他点击时候,我们执行ViewContollr的-(void)click:(id)sender方法,
- 这里传入的UIControlEventTouchUpInside枚举量,就是在控件frame内按下,然后抬起这样一个事件,
- UIContol将这个事件作为key,和目标(target)和目标方法(action)存到了自己私有的字典里。
- 当用户点击按钮时,UIControl响应了触摸链的touchesEnded方法,便会根据私有字典,把对应UIControlEventTouchUpInside的目标(target)和目标方法(action)调用,这样完成事件的回传。
自定义控件可以怎样实现
-
继承自UIView,这是大多数开发者的做法。也能够实现需求,但是一个可交互控件,理应继承于UIControl而非UIView。
-
继承自UIControl,使用UIControl的一套接口规范来实现自定义。
UIControl的重要方法
Target模式就是从UIControl使用的。
-
准备并发送动作消息
sendAction:to:forEvent:响应给定的事件,转发一个动作消息给应用程序派发给目标。 - (void)sendAction:(SEL)`action` to:(id)`target` forEvent:(UIEvent*)`event` UIControl通过转发一个目标动作给单例UIApplication(在它的sendAction:to:fromSender:forEvent:方法中)来实现这个方法来派发给它的目标, 或者如果它没有确定的目标,派发给响应链中第一个愿意处理这个消息的对象中。 子类可能要重载这个方法来观察或者修改动作转发的行为。 每进行一次指定控件的事件,可能会重复用sendActionsForControlEvents这个方法的实现,
-
发送动作消息到给定的控制事件
sendActionsForControlEvents- (void)sendActionsForControlEvents:(UIControlEvents *)controlEvents` UIControl实现这个方法来发送所有controlEvents的动作消息,在进程中重复调用, 查找目标和动作列表在`addTarget:action:forControlEvents:`.之前构造。
-
在内部的派发表中给特殊时间添加一个目标和动作
addTarget:action:forControlEvents:- (void)addTarget:(id)`target` action:(SEL)`action` forControlEvents:(UIControlEvents)`controlEvents` 你可能会多次调用这个方法,并且你可能需要为一个特殊的事件识别多个目标-动作组, 动作消息可以是可选的包含发送者和事件作为参数 当你调用这个方法的时候,目标没有被保留。
-
在内部派发表中将特定事件的目标和动作移除
removeTarget:action:forControlEvents: -
返回所有跟动作事件和特殊指定控制事件相关的动作
actionsForTarget:forControlEvent:- (NSArray *)actionsForTarget:(id)`target` forControlEvent:( UIControlEvents)`controlEvent` 一个包含NSString类型的方法名字的数组或者没有与控制事件相关的方法则则为nil
-
返回与接受者相关联的所有目标对象
- (NSSet*)allTargets 集合里面的目标是动作消息的接受者,
-
返回与接受者相关联的所有控制事件
- (UIControlEvents )allControlEvents 一个或者多个`UIControlEvents` 常量指定与当前接受者相关联的的控制事件
UIControlEvents枚举,定义了iOS交互中的交互方式
UIControlEventTouchDown 控件被按下去的事件
UIControlEventTouchDownRepeat 控件被重复点击的时间,点击次数超过一次
UIControlEventTouchDragInside 在控件范围内按下并拖动的事件
UIControlEventTouchDragOutside 在控件范围内按下并在控件外面拖动的事件
UIControlEventTouchDragEnter 从控件范围外拖动到控件范围内的事件
UIControlEventTouchDragExit 从控件范围外拖动到控件范围内的事件
UIControlEventTouchUpInside 点击控件后在控件范围内释放触发事件
UIControlEventTouchUpOutside 点击控件后在控件范围外释放触发事件
UIControlEventTouchCancel 触摸取消事件
UIControlEventValueChanged 当控件的值发生改变时,发送通知。用于滑块,分段控件,以及其他取值控件。
UIControlEventEditingDidBegin 文本控件开始编辑时发送通知
UIControlEventEditingChanged 文本控件中的内容被改变是发送通知
UIControlEventEditingDidEnd 文本控件结束编辑的时候发送通知
UIControlEventEditingDidEndOnExit 文本控件内通过按下回车(或等价行为)结束编辑时,发送通知。
UIControlEventAllTouchEvents 通知所有触摸事件
UIControlEventAllEditingEvents 通知所有关于文本编辑的时间。
UIControlEventApplicationReserved 为应用程序预留
UIControlEventSystemReserved 为系统内部框架预留
UIControlEventAllEvents 通知所有事件
UIControlState定义了控件的基本状态
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal = 0,
UIControlStateHighlighted = 1 << 0, // used when UIControl isHighlighted is set
UIControlStateDisabled = 1 << 1,
UIControlStateSelected = 1 << 2, // flag usable by app (see below)
UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 3, // Applicable only when the screen supports focus
UIControlStateApplication = 0x00FF0000, // additional flags available for application use
UIControlStateReserved = 0xFF000000 // flags reserved for internal framework use
};