UIResponder
在UIKit中,UIApplication、UIView、UIViewController这几个类都是直接继承自UIResponder类。另外SpriteKit中的SKNode也是继承自UIResponder类。因此UIKit中的视图、控件、视图控制器,以及我们自定义的视图及视图控制器都有响应事件的能力。这些对象通常被称为响应对象,或者是响应者(以下我们统一使用响应者)。
响应链
响应链指的的是处理点击事件的链条(在此之前还要经历由主窗口向上遍历找到触摸点最终控件的过程)。通常第一个响应者位于层级最上方、然后是其俯视图以此类推、链条末端为UIApplication对象。
过程:
1、事件产生、寻找最合适的View
UIApplication -> UIWindow -> 父View -> 子view
2、找到最合适的View、进入响应链进行处理可以参照下面对于nextResponder的解释。如果响应者链上有一个响应者可以处理该事件(实现了touch方法)。则交由他处理、否则最后将被UIApplication丢弃。
管理响应者链
我们可以让一个UIResponder对象参与到响应链中、以便让他响应一些事件(比如手机摇动、弹起键盘)等等。
- nextResponder
返回响应者链中的下一个对象、如果没有则返回nil。利用这个特性、我们可以查找UIView的根控制器 - isFirstResponder
判定是否为第一响应者 - canBecomeFirstResponder
返回视图能否被作为第一响应者 - becomeFirstResponder
尝试让对象称为第一响应者。如果他当前已经是则返回YES、反之为NO。 - resignFirstResponder
如果已经是第一响应者、调用会返回YES并且取消其第一响应者的位置。否则NO。
响应触摸事件
- touchesBegan:withEvent:
一个或多个手指在视图或窗口上触摸 - touchesMoved:withEvent:
一个或多个手指在视图或窗口上移动 - touchesEnded:withEvent:
一个或多个手指从视图或窗口上抬起 - touchesCancelled:withEvent:
当触摸事件被系统事件取消(打断)时
touches参数
保存着跟本次手指触摸相关的信息
1、当用一根手指触摸屏幕时
会创建一个与手指相关联的UITouch对象。
2、当用两根手指同时触摸屏幕
则会调用一次touchesBegan方法、创建两个UITouch对象。
3、当不是同时触摸
调用两次方法,每次的touches参数都只有一个UITouch对象。
UIEvent参数
第一个手指开始触摸屏幕到最后一个手指离开屏幕定义为一个触摸事件
1、UIEvent实际可以包括多个UITouch对象
有几个手指触碰,就会有几个UITouch对象。
2、UITouch对象包括当前手指触碰的屏幕位置等信息
一次完整的触摸过程中、只会产生一个事件对象
响应动作事件
- motionBegan:withEvent:
动作事件开始 - motionEnded:withEvent:
动作事件结束 - motionCancelled:withEvent:
动作事件被系统事件打断(参考touch事件)
响应远程控制事件
- remoteControlReceivedWithEvent:
远程控制事件来源于一些外部的配件,如耳机等。用户可以通过耳机来控制视频或音频的播放。
管理输入视图
所谓的输入视图、是指当对象为第一响应者时、显示另外一个视图用来处理当前对象的信息输入、如UITextView和UITextField两个对象。
输入视图有两种,一个是inputView,另一个是inputAccessoryView。这两者如图所示:

网友评论