觸摸事件傳遞過程

?控件能接收事件的4個基本條件

(1) view.userInteractionEnabled == YES;
(2) view.hidden == NO;
(3) view.alpha > 0.01
(4) 該觸摸點是否落在該控件上
(5) hitTest它只負責找最合適的view來接受這個事件
(6) 如果要攔截事件必須實現(xiàn)touch方法,因為父類的默認處理是把事件拋給上一個響應者

接收(找到事件往下傳遞的終點,找到最佳響應者調用該返回的控件- touchBegan ... 等方法):

1. 用戶觸摸屏幕系統(tǒng)會產生一個UITouch對象,Event事件(里面包含UIEvent對象)
2. 然后把這次事件放進主運行循環(huán)的消息隊列中
3. 當UIAplication對象接收到這個事件的時候就會把這個事件交給UIWindow來處理
4. UIWindow會判斷它自身是否符合能接收事件的四個基本條件,如果不行則事件傳遞到此結束,否則會執(zhí)行以下步驟
5. UIWindow(UIWindow自身也實現(xiàn)這個方法了,如果它的子控件沒有合適的它的最終返回值為nil)會根據它子控件的數量從后往前遍歷
6. 系統(tǒng)判斷事件處理者的兩個重要的方法,我們可以重寫這兩個方法來自定義接收事件的最佳對象
/**
 判斷一個View是否處理事件的最佳人選(如果父控件不能接收事件那么子控件肯定不能接收事件) :
 注意 :
 a. 如果想自己成為處理這個事件的最佳人選,阻斷事件往下傳播執(zhí)行以下兩步操作:
 a1. 重寫 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
 a2. 返回自身(注意判斷觸摸點是否落在該控件上)
 
 b. 這個返回值是非常關鍵的,因為它決定事件的走向 和
 決定誰來處理這個事件(調用該返回的控件- touchBegan ... 等方法)
 
 1. 判斷它 userInteractionEnabled == YES hidden == NO alpha > 0.01
 2. 判斷觸摸點是否落在該控件上(在該控件的坐標系中: x > 0 && y > 0)
 3. 從后往前遍歷它的子控件,看它的子控件是否滿足以上條件
 4. 如果它的子控件有一個滿足以上條件,則返回該子控件,否則返回自身
 5. 如果它自身也不滿足 1 和 2 條件則返回空
 */
/**
* 從該View的層次結構中尋找最佳的事件接收者,如果沒有則返回nil
*
*  @param point 在該view上的坐標系的點
*  @param event 事件對象
*
*  @return 最佳接收該事件的view nil 則沒有最佳接收該事件的人選,事件往上拋
*/
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
   //     1. 判斷它 userInteractionEnabled == YES hidden == NO alpha > 0.01
   if ( self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01 ) return nil;
   //     2. 判斷觸摸點是否落在該控件上(在該控件的坐標系中: x > 0 && y > 0)
   if ( [self pointInside:point withEvent:event] == NO ) return nil;
   //    3. 從后往前遍歷它的子控件,看它的子控件是否滿足以上條件
   NSInteger count = self.subviews.count;
   for (NSInteger i = count - 1; i >= 0; i--) {
       UIView *subView = self.subviews[i];
       CGPoint subP = [self convertPoint:point toView:subView];
       UIView *target = [subView hitTest:subP withEvent:event];
       if ( target != nil ) {
           return target;
       }
   }
   // 如果子控件沒有合適人選,來到這里就足以證明控件自身滿足接收該事件的人選
   return self;
}
/**
 *  判斷觸摸點是否落在控件上(x > 0 && y > 0 && 點在該控件的范圍內)
 *
 *  @param point 在該坐標系內的點
 *  @param event 觸摸事件對象
 *
 *  @return YES 觸摸點落在該控件上 NO 觸摸點沒有落在該控件上
 */
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    //    return [super pointInside:point withEvent:event];
    // 模仿系統(tǒng)實現(xiàn)的方法
    return CGRectContainsPoint(self.bounds, point);
}

響應

如果在事件接收過程中找到合適的人選了,但該人選沒有實現(xiàn)任何的 touch... 方法,那么系統(tǒng)默認會給我們默認實現(xiàn)以下事件相應流程 : 
1. 系統(tǒng)會把事件逐層往上傳遞
2. 最終會傳遞到控制器的view(控制器的view會默認調用控制器的 touch... 方法),如果控制器沒有實現(xiàn)這些方法,事件會再次傳遞給UIWindow癌蚁,UIWindow會默認把這個事件銷毀,那么這次事件傳遞結束
3. 如果UIWindow的根控制器是導航控制器那么默認的事件傳遞會遵循以下步驟 : 
1. 系統(tǒng)會把事件逐層往上傳遞
2. 最終會傳遞到導航控制器的當前控制器的view(控制器的view會默認調用控制器的 touch... 方法)江解,如果當前控制器沒有實現(xiàn)這些方法, 事件會傳遞給導航控制器的view然后會調用導航控制器的 touch 方法,如果導航控制器沒有實現(xiàn)這些方法,事件會再次傳遞給UIWindow铐伴,UIWindow會默認把這個事件銷毀,那么這次事件傳遞結束
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔚鸥,隨后出現(xiàn)的幾起案子续搀,更是在濱河造成了極大的恐慌符糊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甘改,死亡現(xiàn)場離奇詭異旅东,居然都是意外死亡,警方通過查閱死者的電腦和手機十艾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門抵代,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忘嫉,你說我怎么就攤上這事荤牍。” “怎么了庆冕?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵康吵,是天一觀的道長。 經常有香客問我愧杯,道長涎才,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任力九,我火速辦了婚禮耍铜,結果婚禮上,老公的妹妹穿的比我還像新娘跌前。我一直安慰自己棕兼,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布抵乓。 她就那樣靜靜地躺著伴挚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灾炭。 梳的紋絲不亂的頭發(fā)上茎芋,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音蜈出,去河邊找鬼田弥。 笑死,一個胖子當著我的面吹牛铡原,可吹牛的內容都是我干的偷厦。 我是一名探鬼主播商叹,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只泼!你這毒婦竟也來了剖笙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤请唱,失蹤者是張志新(化名)和其女友劉穎弥咪,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體十绑,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡酪夷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孽惰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晚岭。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勋功,靈堂內的尸體忽然破棺而出坦报,到底是詐尸還是另有隱情,我是刑警寧澤狂鞋,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布片择,位于F島的核電站,受9級特大地震影響骚揍,放射性物質發(fā)生泄漏字管。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一信不、第九天 我趴在偏房一處隱蔽的房頂上張望嘲叔。 院中可真熱鬧,春花似錦抽活、人聲如沸硫戈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丁逝。三九已至,卻和暖如春梭姓,著一層夾襖步出監(jiān)牢的瞬間霜幼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工誉尖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罪既,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像萝衩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子没咙,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容