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
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

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