-
UI框架的类图
- UI的对象模型
-
UIResponder
1、了解了UIResponder的概念后,再来看iOS事件的相关概念,iOS中有三种事件概念:触摸事件、运动事件(motion)、远程控制事件(remote control)。枚举定义如下:
typedef enum {
UIEventTypeTouches,
UIEventTypeMotion,
UIEventTypeRemoteControl,
} UIEventType;
UIResponder的触摸事件的方法:
-touchesBegan:withEvent:当用户触摸到屏幕时调用方法
-touchesEnded:withEvent:当用户触摸到屏幕并移动时调用此方法
-touchesMoved:withEvent:当触摸离开屏幕时调用此方法
-touchesCancled:withEvent:当触摸被取消时调用此方法
UIResponder的运动相关事件的方法:(iOS3.0+开始支持)
-motionBegan:withEvent:运动开始时执行
-motionEnded:withEvent:运动结束时执行
-motionCancled:withEvent:运动被取消时执行
UIResponder的运程控制事件方法:(iOS4.0+开始支持)
-remoteControlReceivedWithEvent
2、接收事件之后,使用到的响应链函数,
-nextResponder 下一个响应者,在实现中,一般会返回父级对象
-isFirstResponder 指示对象是否为第一响应者,这里的第一响应者就是当前有焦点的对象,叫法挺奇怪的,第一次看到真还难以理解这个叫法所表达的意思
-canBecomeFirstResponder 获取一个布尔值,指定对象是否可以获取焦点
-becomeFirstResponder 把对象设置为 firstResponder 对象
-canResignFirstResponder 对象是否可以取消 firstResponder 对象
-resignFirstResponder 取消对象为 firstResponder 对象
3、在UIResponder中有一个非常重要的概念叫做Responder Chain,个人的理解是这是按照一定规则组织的响应、处理事件的一条链表。在了解UIResponder之前还得在了解一个概念Hit-Testing。在IOS中通常使用hit-testing去找到那个被触摸的视图。这个视图叫hit-test view,当IOS找到hit-test view后就把touch event交个那个视图来处理。下面画个图来说明一下,当点击视图E时看一下hit-testing的工作过程。
1.确定改触摸事件发生在view A范围内,接下来测试view B以及view C。
2.检查发现事件不再view B范围内发生,接下来检查view C发现触摸事件发生在了view C中,所以检查 view D,view E。
3.最后发现事件发生在view E的范围内所以view E成为了hit-test view。
下面是关于调用hit-test的官方说明:
The hitTest:withEvent:
method returns the hit test view for a given CGPoint
and UIEvent
. The hitTest:withEvent:
method begins by calling thepointInside:withEvent:
method on itself. If the point passed into hitTest:withEvent:
is inside the bounds of the view, pointInside:withEvent:
returns YES
. Then, the method recursively calls hitTest:withEvent:
on every subview that returns YES
.
Responder Chain 是由responder对象组成的
canBecomeFirstResponder
方法让他返回YES