国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS中響應者鏈條-觸摸事件

2019-11-14 19:18:00
字體:
來源:轉載
供稿:網友

總體來說,分2個步驟:

    一,從上到下尋找合適的控件來處理這個觸摸事件。如下圖,如果點擊了黃色4,則UIapplication -> UIWindow -> 1白色 -> 2橙色 -> 3藍色 -> 4黃色。

    二,找到4黃色后,再從下到上遍歷響應者鏈條:4黃色 -> 3藍色 -> 2橙色  -> 1白色  -> UIWindow  -> UIApplication

      1)如果4黃色實現了touches...這些函數(具體下面第二條)且沒有調用 super...則事件不再向上傳遞;如果調用了super...方法則事件會繼續向上傳遞。

      2)如果4黃色沒有實現touches...這些函數,則直接向上傳遞。

 

詳細介紹:

1 什么是響應者對象

  在iOS中不是任何對象都能處理事件,只有繼承了UIResponder的對象才能接收并處理事件。我們稱之為“響應者對象”

2 觸摸事件常用處理方法

  • -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;一根或者多根手指開始觸摸view
  • -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;一根或者多根手指在view上移動(只有產生一定的位移才會調用)
  • -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;一根或者多根手指離開view,系統會自動調用view的下面方法
  • -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 觸摸結束前,某個系統事件(例如電話呼入)會打斷觸摸過程

    提示:touches中存放的都是UITouch對象

3  UITouch對象

   當用戶用一根手指觸摸屏幕時,會創建一個與手指相關聯的UITouch對象,一個手指對應一個UITouch對象。如果有兩個手指則會有UITouch對象,因此可以根據(NSSet *)touches的個數來判斷有幾個手指。

    作用:

  • 保存著跟手指相關的信息,比如觸摸的位置、時間、階段;
  • 當手指移動時,系統會更新同一個UITouch對象;
  • 當手指離開屏幕時,系統會銷毀相應的UITouch對象。

4  UIView不接收觸摸事件的三種情況

  • userInteractionEnabled = NO
  • hidden = YES
  • alpha = 0.0 ~ 0.01

提示:UIImageView的userInteractionEnabled默認是NO,因此它和它的子控件默認不能接收觸摸事件。

5  尋找合適的響應者

    從上到下尋找合適的控件,比如UIApplication -> UIWindow ->父控件子控件這樣一級一級的找下去。

    尋找順序,或原則

  • 1> 自己是否能接收觸摸事件?否,事件傳遞到此結束;
  • 2> 觸摸點是否在自己身上?否,事件傳遞到此結束。調用;
  • 3> 從后往前遍歷子控件,重復前面的兩個步驟 (所謂從后往前遍歷:即后添加的控件優先級高。準確說是subviews數組后面的優先級高,如果是storyboard開發,則是下面的優先級高);
  • 4> 如果沒有符合條件的子控件,那么就自己最適合處理。

  調用的兩個函數:- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

總結:很明顯,如果父控件不能接收,則不再找子控件。

6  響應者鏈條 

   從下到上尋找合適的控件來處理這個事件,如果實現了touches。。。函數且沒有調用super方法則事件不再向上傳,如果沒有實現touches或者在touches里面調用了super方法則事件繼續向上傳。(super不是指的父類,而是上一個響應者)

提示:如果當前的view是控制器的view,那控制器就是上一級響應者,否則上一級響應者為父控件。

7  自己實現touches...

    如果沒有調用super...,則系統不會做默認的處理,比如實現了UIButton的touchBegan方法則系統不會執行button的敲擊事件(不發送消息)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜平县| 玉林市| 清徐县| 张家川| 东兴市| 冕宁县| 宜宾市| 林甸县| 和田县| 内黄县| 忻州市| 芦山县| 如皋市| 稻城县| 永寿县| 岫岩| 大埔区| 集贤县| 鄂托克前旗| 右玉县| 和平区| 鹿泉市| 将乐县| 西盟| 唐河县| 康乐县| 庆安县| 孟连| 梁河县| 图木舒克市| 济宁市| 密云县| 吕梁市| 九江市| 濮阳县| 白山市| 汉阴县| 清新县| 南岸区| 博乐市| 临洮县|