深入淺出iOS事件機制

本文章將講解有關iOS事件的傳遞機制,如有錯誤或者不同的見解愚战,歡迎留言指出胞枕。

iOS的事件有好幾種:Touch Events(觸摸事件)羹与、Motion Events(運動事件,比如重力感應和搖一搖等)爹橱、Remote Events(遠程事件萨螺,比如用耳機上得按鍵來控制手機),其中最常用的應該就是Touch Events了宅荤,基本存在于每個app的每個地方屑迂,今天我們主要就講講它,至于其他兩個事件有興趣的可以自行查閱資料冯键。

在網頁上當我們講到事件惹盼,我們會講到事件響應鏈,我們會講到事件的響應者和事件的傳遞方式(冒泡)惫确,那么在app上手报,其實也離不開這幾個問題,今天我們也重這幾個方面來介紹iOS的事件機制: 1改化、響應鏈是什么時候怎樣構建的掩蛤? 2、事件第一個響應者是怎么確定的陈肛? 3揍鸟、事件第一個響應者確定后,系統是怎樣傳遞事件的句旱?

響應鏈的構建

無論是哪種事件阳藻,其傳遞和響應都與響應鏈息息相關,那么響應鏈到底是一個什么樣的東西呢谈撒? 在UIKit中有一個類:UIResponder腥泥,我們可以看看頭文件的幾個屬性和方法:

iosevent_1.png

UIResponder是所有可以響應事件的類的基類(從名字應該就可以看出來了),其中包括最常見的UIView和UIViewController甚至是UIApplication啃匿,所以我們的UIView和UIViewController都是作為響應事件的載體蛔外。

那么響應鏈跟這個UIResponder有什么關系呢?事實事件響應鏈的形成和事件的響應和傳遞溯乒,UIResponder都幫我們做了很多事夹厌。我們的app中,所有的視圖都是按照一定的結構組織起來的橙数,即樹狀層次結構呼渣,每個view都有自己的superView衡招,包括controller的topmost view(controller的self.view)昙读。當一個view被add到superView上的時候,他的nextResponder屬性就會被指向它的superView逻住,當controller被初始化的時候,self.view(topmost view)的nextResponder會被指向所在的controller迎献,而controller的nextResponder會被指向self.view的superView瞎访,這樣,整個app就通過nextResponder串成了一條鏈吁恍,也就是我們所說的響應鏈扒秸。所以響應鏈就是一條虛擬的鏈,并沒有一個對象來專門存儲這樣的一條鏈冀瓦,而是通過UIResponder的屬性串連起來的伴奥。如下圖:

iosevent_2.png
iosevent_3.png
Hit-Testing View

文章開頭說到有iOS三種event類型,事件傳遞中UIWindow會根據不同的event翼闽,用不同的方式尋找initial object拾徙,initial object決定于當前的事件類型。比如Touch Event感局,UIWindow會首先試著把事件傳遞給事件發(fā)生的那個view尼啡,就是下文要說的hit-testview。對于Motion和Remote Event询微,UIWindow會把例如震動或者遠程控制的事件傳遞給當前的firstResponder崖瞭,有關firstResponder的相關信息請看這里。下面主要講Touch Event的hit-testview撑毛。

有了事件響應鏈书聚,接下來的事情就是尋找響應事件的具體響應者了,我們稱著為:Hit-Testing View藻雌,尋找這個View的過程我們稱著為Hit-Test寺惫。

那么什么是Hit-Test呢,我們可以把它理解為一個探測器蹦疑,通過這個探測器我們可以找到并判斷手指是否點擊在某個視圖上面,換句話說就是通過Hit-Test可以找到手指點擊到的處于屏幕最前面的那個UIView萨驶。

在解釋Hit-Test是怎么工作之前歉摧,先來看看它是什么時候被調用的。前面說Hit-Test是一個探測器腔呜,那么在代碼里面其實就是一個函數叁温,UIView有如下兩個方法:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

每當手指接觸屏幕,UIApplication接收到手指的事件之后核畴,就會去調用UIWindow的hitTest:withEvent:膝但,看看當前點擊的點是不是在window內,如果是則繼續(xù)依次調用subView的hitTest:withEvent:方法谤草,直到找到最后需要的view跟束。調用結束并且hit-test view確定之后莺奸,這個view和view上面依附的手勢,都會和一個UITouch的對象關聯起來冀宴,這個UITouch會作為事件傳遞的參數之一灭贷,我們可以看到UITouch頭文件里面有一個view和gestureRecognizers的屬性,就是hitTest view和它的手勢略贮。

現在知道Hit-Test是什么時候調用了甚疟,那么接下來看看它是怎么工作的。Hit-Test是采用遞歸的方法從view層級的根節(jié)點開始遍歷逃延,看看下面這張圖:

由于排版原因览妖,直接原文鏈接:

http://zhoon.github.io/ios/2015/04/12/ios-event.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市揽祥,隨后出現的幾起案子讽膏,更是在濱河造成了極大的恐慌,老刑警劉巖盔然,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桅打,死亡現場離奇詭異,居然都是意外死亡愈案,警方通過查閱死者的電腦和手機挺尾,發(fā)現死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來站绪,“玉大人遭铺,你說我怎么就攤上這事』肿迹” “怎么了魂挂?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馁筐。 經常有香客問我涂召,道長,這世上最難降的妖魔是什么敏沉? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任果正,我火速辦了婚禮,結果婚禮上盟迟,老公的妹妹穿的比我還像新娘秋泳。我一直安慰自己,他們只是感情好攒菠,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布迫皱。 她就那樣靜靜地躺著,像睡著了一般辖众。 火紅的嫁衣襯著肌膚如雪卓起。 梳的紋絲不亂的頭發(fā)上和敬,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音既绩,去河邊找鬼概龄。 笑死,一個胖子當著我的面吹牛饲握,可吹牛的內容都是我干的私杜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼救欧,長吁一口氣:“原來是場噩夢啊……” “哼衰粹!你這毒婦竟也來了?” 一聲冷哼從身側響起笆怠,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤铝耻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹬刷,有當地人在樹林里發(fā)現了一具尸體瓢捉,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年办成,在試婚紗的時候發(fā)現自己被綠了泡态。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡迂卢,死狀恐怖某弦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情而克,我是刑警寧澤靶壮,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站员萍,受9級特大地震影響腾降,放射性物質發(fā)生泄漏。R本人自食惡果不足惜碎绎,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一蜂莉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧混卵,春花似錦、人聲如沸窖张。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宿接。三九已至赘淮,卻和暖如春辕录,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梢卸。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工走诞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛤高。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓蚣旱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親戴陡。 傳聞我的和親對象是個殘疾皇子塞绿,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容