iOS基礎 事件 響應者鏈

2022-09-02 13:15:09 字數 2343 閱讀 2631

事件

1 - 事件是由硬體捕捉並產生的乙個表示使用者操作裝置的物件傳送給 ios

2 - 許多事件都是 uikit 框架中 uievent 類的例項。uikit 當前可以識別三種型別的事件:觸控事件、搖動事件以及遠端控制事件

3 - 觸控事件:⽤戶通過觸控裝置螢幕操作物件、輸入資料。它支援多點觸控:包含1個到多個觸控點

響應者鏈

1 - ios 中所有能響應事件(觸控、晃動、遠端事件)的物件都是響應者,系統定義了⼀個抽象的父類 uiresponder 來表示響應者(其⼦類都是響應者)

顧名思義,由多個響應者物件組成的鏈就是響應者鏈

第一步 

viewa -> viewb | viewc(遞迴檢測);第三步:

viewc -> viewd | viewe(最終檢測到 viewe)

3 - 事件的產生

③ keywindow 會在檢視層次結構中找到乙個最合適的檢視來處理觸控事件,這也是整個事件處理過程的第一步

④ 找到合適的檢視控制項後,就會呼叫檢視控制項的 touches 方法來作具體的事件處理

① 首先判斷自己是否能接受觸控事件 -(uiview*)hittest:(cgpoint)point withevent:(uievent *)event

② 觸控點是否在自己身上 -(bool)pointinside:(cgpoint)point withevent:(uievent *)event

③ 從後往前遍歷子控制項,重複前面的兩個步驟( 首先查詢陣列中最後乙個元素 )

④ 如果沒有符合條件的子控制項,那麼就認為自己最合適處理

5 - 不參與事件傳遞的檢視

① 不允許互動的檢視:userinteractionenabled = no

② 所隱藏的檢視:如果把父控制項隱藏,那麼子控制項也會隱藏

③ 透明度:透明度為 0 或者 alpha<0.01

④ 檢視超出父檢視的區域

6 - **示例

1

#import""

2#import

"viewcontroller.h

"

23 self.window =[[uiwindow alloc] initwithframe:[[uiscreen mainscreen] bounds]];

4 self.window.backgroundcolor =[uicolor whitecolor];

5[self.window makekeyandvisible];

67 viewcontroller *firstvc =[[viewcontroller alloc] init];

8 self.window.rootviewcontroller =firstvc;

9return

yes;

1011 }

// - viewcontroller.m

1

#import

"firstviewcontroller.h"2

#import

"touchview.h"//

touchview:繼承自 uiview,直接建立即可

1 - (void

)viewdidload

1617

// 通過響應者鏈可以逐級查詢到響應者

18 - (void

1920

21 touchview * tapview = (touchview *)[self.view viewwithtag:102

];22 nslog(@"

[[[touchview nextresponder] nextresponder] nextresponder]:%@

",[[[tapview nextresponder] nextresponder] nextresponder] );//

window

23 nslog(@"

%@",[[[[tapview nextresponder] nextresponder] nextresponder] nextresponder]);//

24 }

7 - 處理事件(以觸控事件為例)

事件一旦檢測到響應者,該響應者就實現相應的方法,開始處理事件

如果該響應者沒有該處理事件(如互動未開啟),那麼它就會依次向上逐級遞交任務,檢驗其上級是否會作處理......

iOS事件傳遞 響應者鏈

事件傳遞 響應者鏈 對於觸控事件來說,window 會傳到 發生觸控的view,被稱之為hit test view。此過程叫 hit testing。對於手勢和遠端控制,這個第一響應被發到 first responder.最終響應者鏈要找到處理事件的物件。規則如下。1 hit testing 檢測的...

iOS 響應者鏈,事件的傳遞

先將事件物件由上往下傳遞 由父控制項傳遞給子控制項 找到最合適的控制項來處理這個事件。呼叫最合適控制項的touches 方法 如果呼叫了 super touches 就會將事件順著響應者鏈條往上傳遞,傳遞給上乙個響應者 接著就會呼叫上乙個響應者的touches 方法 如果當前這個view是控制器的v...

iOS 響應者鏈,事件的傳遞

觸控事件 對於觸控事件,window物件會嘗試著首先將事件傳遞給觸控事件發生點得view。這個view被視為 命中測試view hit test view 尋找 命中測試view 的過程被稱作 命中測試 關於 命中測試 會在下面的命中測試返回觸控事件發生點的view有詳情描述。手勢和遠端控制事件 對...