一 . “事件傳遞過程”
1.問題描述
1. A和C是普通的view, B是一個綁定事件的按鈕,A添加了點擊手勢。 此時點擊C紊撕,響應A的tap手勢事件黑滴?還是B的按鈕點擊事件憨募?
視圖布局示例
2. 運行結果
- C視圖開啟用戶交互時,此次響應的是A視圖的tap手勢事件
- 禁用C視圖用戶交互時袁辈,此次響應的是B視圖的按鈕點擊事件
但是為啥菜谣?
3.觸摸事件
1> 只要繼承UIResponder就能能夠響應并處理觸摸事件
2> UIResponder包三種事件:觸摸事件、加速計事件吵瞻、遠程控制事件
觸摸事件方法
- (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的作用就是它會保存著這個手指相關的一些信息橡羞,觸摸時間眯停,位置,階段等之類的信息卿泽。
2> 當手指移動時莺债,系統(tǒng)會更新同一個UITouch對象,使之能夠一直保存該手指在的觸摸位置, 當手指頭離開屏幕的時候签夭,那么與之對應的UITouch對象就會銷毀了齐邦。
UITouch的屬性
觸摸產(chǎn)生時所處的窗口
@property(nonatomic,readonly,retain) UIWindow *window;
觸摸產(chǎn)生時所處的視圖
@property(nonatomic,readonly,retain) UIView *view;
短時間內(nèi)點按屏幕的次數(shù),可以根據(jù)tapCount判斷單擊第租、雙擊或更多的點擊
@property(nonatomic,readonly) NSUInteger tapCount;
記錄了觸摸事件產(chǎn)生或變化時的時間措拇,單位是秒
@property(nonatomic,readonly) NSTimeInterval timestamp;
當前觸摸事件所處的狀態(tài)
@property(nonatomic,readonly) UITouchPhase phase;
其中的UITouchPhase是一個枚舉類型,包含:
UITouchPhaseBegan(觸摸開始)
UITouchPhaseMoved(接觸點移動)
UITouchPhaseStationary(接觸點無移動)
UITouchPhaseEnded(觸摸結束)
UITouchPhaseCancelled(觸摸取消)
UITouch的方法
- (CGPoint)locationInView:(UIView *)view;
返回值表示觸摸在view上的位置
這里返回的位置是針對view的坐標系的(以view的左上角為原點(0, 0))
調(diào)用時傳入的view參數(shù)為nil的話慎宾,返回的是觸摸點在UIWindow的位置
- (CGPoint)previousLocationInView:(UIView *)view;
該方法記錄了前一個觸摸點的位置
二. “hitTest:方法底層實現(xiàn)”
hitTest:方法底層實現(xiàn)