IOS視圖繼承關(guān)系和事件響應(yīng)鏈

UIView:UIView->UIResponder->NSObject

UIViewController:UIViewController->UIResponder->NSObject

UIWindow:UIWindow->UIView

UIButton/UISwitch/UITextField:UIButton/UISwitch/UITextField->UIControl->UIView

UILabel:UILabel->UIView

CALayer:CALayer->NSObject


UIWindow算是一種特殊的View敞贡,他默認(rèn)在視圖最頂端悼粮,有自己的一套優(yōu)先級(jí)惕它。可以創(chuàng)建多個(gè)因块,控制顯示級(jí)別。

CALayer和UIView是相互依賴的籍铁,繼承于UIView的都有l(wèi)ayer這個(gè)屬性涡上,CALayer用于渲染視圖,繪制具體的像素拒名。UIView只是提供一個(gè)容器吩愧。真正繪制內(nèi)容的是CALayer。UIView的主layer以外增显,對(duì)它的subLayer雁佳,也就是子layer的屬性進(jìn)行更改,系統(tǒng)將自動(dòng)進(jìn)行動(dòng)畫生成同云。

從上面的繼承關(guān)系可以看出糖权,繼承于UIResponder的才有用戶點(diǎn)擊事件。

UIControl是控件類的基類梢杭,它是一個(gè)抽象基類温兼,我們不能直接使用UIControl類來實(shí)例化控件,它只是為控件子類定義一些通用的接口武契,并提供一些基礎(chǔ)實(shí)現(xiàn)募判,以在事件發(fā)生時(shí),預(yù)處理這些消息并將它們發(fā)送到指定目標(biāo)對(duì)象上咒唆。他是將UIResponder中的復(fù)雜觸摸事件封裝成了簡(jiǎn)單事件届垫。

NSObject是所有控件的基類。

UIView內(nèi)部分三個(gè)樹:

第一份全释,邏輯樹装处,就是代碼里可以操縱的,例如更改layer的屬性等等就在這一份。

第二份妄迁,動(dòng)畫樹寝蹈,這是一個(gè)中間層,系統(tǒng)正在這一層上更改屬性登淘,進(jìn)行各種渲染操作箫老。

第三份,顯示樹黔州,這棵樹的內(nèi)容是當(dāng)前正被顯示在屏幕上的內(nèi)容耍鬓。

這三棵樹的邏輯結(jié)構(gòu)都是一樣的,區(qū)別只有各自的屬性流妻。


說一下事件響應(yīng)鏈牲蜀。

具體的事件響應(yīng)方式就不介紹了,幾種手勢(shì)那種绅这。

用戶點(diǎn)擊屏幕以后我們可以通過hitTest:withEvent:來獲取點(diǎn)擊的點(diǎn)和view涣达。

在iOS中不是任何對(duì)象都能處理事件,只有繼承了UIResponder的對(duì)象才能接受并處理事件证薇,我們稱之為“響應(yīng)者對(duì)象”峭判。這個(gè)上面已經(jīng)講過了。

假設(shè)現(xiàn)在有個(gè)頁(yè)面棕叫,VC->View(兩個(gè)子視圖-BView,DView)->BView(子視圖CView)

這時(shí)候用戶點(diǎn)擊了CView林螃,響應(yīng)鏈:

用戶觸摸->產(chǎn)生觸摸事件->UIApplication事件隊(duì)列->UIWindow->UIView->AView->DView->BView->CView

也就是說,當(dāng)用戶產(chǎn)生觸摸事件以后俺泣,系統(tǒng)會(huì)先去查找application疗认,然后交給window,如果接收不了會(huì)繼續(xù)遍歷VC中的View伏钠,這個(gè)時(shí)候是優(yōu)先subView中的最后一個(gè)横漏,也就是視圖最頂端,如果找不到繼續(xù)遍歷View的子視圖熟掂,同樣的方式缎浇,優(yōu)先遍歷subView中最后一個(gè)。直到找到響應(yīng)者赴肚。

注意:

這里有這樣一個(gè)方法素跺,- (nullable UIResponder *)nextResponder,獲取當(dāng)前view的下一個(gè)響應(yīng)者誉券,但是有前輩已經(jīng)發(fā)現(xiàn)這個(gè)方法查找出來的響應(yīng)鏈?zhǔn)清e(cuò)誤的指厌,因?yàn)樗檎业降氖撬衦esponse,包括VC踊跟。但是很明顯VC并不應(yīng)該是用戶事件的響應(yīng)者踩验。如果通過這個(gè)方法來查找下一個(gè)響應(yīng)視圖得到的結(jié)果是錯(cuò)誤的。

然后查閱View里面的方法,大概猜到這才應(yīng)該是獲取到當(dāng)前響應(yīng)事件的下一個(gè)響應(yīng)者View箕憾。

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

-?(BOOL)pointInside:(CGPoint)point?withEvent:(nullable?UIEvent?*)event;

然后通過runtime替換著兩個(gè)方法牡借,果然獲取到的響應(yīng)鏈變了,具體的就是上面的圖片所示袭异。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓖捶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扁远,更是在濱河造成了極大的恐慌,老刑警劉巖刻像,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畅买,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡细睡,警方通過查閱死者的電腦和手機(jī)谷羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溜徙,“玉大人湃缎,你說我怎么就攤上這事〈酪迹” “怎么了嗓违?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)图贸。 經(jīng)常有香客問我蹂季,道長(zhǎng),這世上最難降的妖魔是什么疏日? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任偿洁,我火速辦了婚禮,結(jié)果婚禮上沟优,老公的妹妹穿的比我還像新娘涕滋。我一直安慰自己,他們只是感情好挠阁,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布宾肺。 她就那樣靜靜地躺著,像睡著了一般侵俗。 火紅的嫁衣襯著肌膚如雪爱榕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天坡慌,我揣著相機(jī)與錄音黔酥,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跪者,可吹牛的內(nèi)容都是我干的棵帽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼渣玲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼逗概!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忘衍,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤逾苫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枚钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铅搓,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年搀捷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了星掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫩舟,死狀恐怖氢烘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情家厌,我是刑警寧澤播玖,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站饭于,受9級(jí)特大地震影響黎棠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镰绎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一脓斩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畴栖,春花似錦随静、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至照皆,卻和暖如春重绷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膜毁。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工昭卓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愤钾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓候醒,卻偏偏與公主長(zhǎng)得像能颁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倒淫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 7伙菊、不使用IB是,下面這樣做有什么問題敌土? 6镜硕、請(qǐng)說說Layer和View的關(guān)系,以及你是如何使用它們的返干。 1.首先...
    AlanGe閱讀 683評(píng)論 0 1
  • 本文來自:http://ios.jobbole.com/84081/ 前言: 按照時(shí)間順序兴枯,事件的生命周期是這樣的...
    HackerOnce閱讀 2,841評(píng)論 1 10
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜犬金,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,516評(píng)論 6 30
  • UI viewcontroller的一些方法的說明viewDidLoad,viewWillDisappear, v...
    b485c88ab697閱讀 3,571評(píng)論 0 22
  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件六剥。本想自己總結(jié)一下晚顷,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位疗疟,特此轉(zhuǎn)載该默。作者:L...
    WQ_UESTC閱讀 6,026評(píng)論 4 26