UI篇-自定义控件之基类UIControl

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
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 57,816评论 51 602
  • 在开发过程中,大家或多或少的都会碰到令人头疼的手势冲突问题,正好前两天碰到一个类似的bug,于是借着这个机会了解了...
    闫仕伟阅读 5,391评论 2 23
  • 我们在开发应用的时候,经常会用到各种各样的控件,诸如按钮(UIButton)、滑块(UISlider)、分页控件(...
    傻傻小萝卜阅读 696评论 0 1
  • 一、简介 <<UIButton(按钮) : 既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置,实现了监...
    无邪8阅读 5,670评论 0 2
  • 又到了这个时候。距离2009年的这个时候,转眼之间已经过了六年。谢谢你,我坚信是你让我们彼此认识。昨天特意在各大音...
    地沟油炸鸡阅读 179评论 0 0