一 . “事件傳遞過程”
1.問題描述
1. A和C是普通的view, B是一個綁定事件的按鈕,A添加了點(diǎn)擊手勢。 此時點(diǎn)擊C,響應(yīng)A的tap手勢事件?還是B的按鈕點(diǎn)擊事件?

視圖布局示例
2. 運(yùn)行結(jié)果
- C視圖開啟用戶交互時,此次響應(yīng)的是A視圖的tap手勢事件
- 禁用C視圖用戶交互時,此次響應(yīng)的是B視圖的按鈕點(diǎn)擊事件
但是為啥?
3.觸摸事件
1> 只要繼承UIResponder就能能夠響應(yīng)并處理觸摸事件
2> UIResponder包三種事件:觸摸事件、加速計(jì)事件、遠(yuǎn)程控制事件
觸摸事件方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
以上三個方法中,其中都包含著UITouch對象。
1> UITouch的作用就是它會保存著這個手指相關(guān)的一些信息,觸摸時間,位置,階段等之類的信息。
2> 當(dāng)手指移動時,系統(tǒng)會更新同一個UITouch對象,使之能夠一直保存該手指在的觸摸位置, 當(dāng)手指頭離開屏幕的時候,那么與之對應(yīng)的UITouch對象就會銷毀了。
UITouch的屬性
觸摸產(chǎn)生時所處的窗口
@property(nonatomic,readonly,retain) UIWindow *window;
觸摸產(chǎn)生時所處的視圖
@property(nonatomic,readonly,retain) UIView *view;
短時間內(nèi)點(diǎn)按屏幕的次數(shù),可以根據(jù)tapCount判斷單擊、雙擊或更多的點(diǎn)擊
@property(nonatomic,readonly) NSUInteger tapCount;
記錄了觸摸事件產(chǎn)生或變化時的時間,單位是秒
@property(nonatomic,readonly) NSTimeInterval timestamp;
當(dāng)前觸摸事件所處的狀態(tài)
@property(nonatomic,readonly) UITouchPhase phase;
其中的UITouchPhase是一個枚舉類型,包含:
UITouchPhaseBegan(觸摸開始)
UITouchPhaseMoved(接觸點(diǎn)移動)
UITouchPhaseStationary(接觸點(diǎn)無移動)
UITouchPhaseEnded(觸摸結(jié)束)
UITouchPhaseCancelled(觸摸取消)
UITouch的方法
- (CGPoint)locationInView:(UIView *)view;
返回值表示觸摸在view上的位置
這里返回的位置是針對view的坐標(biāo)系的(以view的左上角為原點(diǎn)(0, 0))
調(diào)用時傳入的view參數(shù)為nil的話,返回的是觸摸點(diǎn)在UIWindow的位置
- (CGPoint)previousLocationInView:(UIView *)view;
該方法記錄了前一個觸摸點(diǎn)的位置
二. “hitTest:方法底層實(shí)現(xiàn)”

hitTest:方法底層實(shí)現(xiàn)
更多參考鏈接(http://m.itdecent.cn/p/e84e3f47a040
)