iOS響應鏈和傳遞機制


iOS中加載的時候會先執行main函數

[objc]  view plain  copy
 print?
  1. int main(int argc, charchar * argv[]) {  
  2.     @autoreleasepool {  
  3.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
  4.     }  
  5. }  

根據main函數的參數加載UIApplication->AppDelegate->UIWindow->UIViewController->superView->subViews
關系為:UIApplication.keyWindow.rootViewController.view.subView
事件傳遞機制:
1.當iOS程序中發生觸摸事件后,系統會將事件加入到UIApplication管理的一個任務隊列中
2.UIApplication將處於任務隊列最前端的事件向下分發。即UIWindow。
3.UIWindow將事件向下分發,即UIView。
4.UIView首先看自己是否能處理事件,觸摸點是否在自己身上。如果能,那么繼續尋找子視圖。
5.遍歷子控件,重復以上兩步。
6.如果沒有找到,那么自己就是事件處理者。如果
7.如果自己不能處理,那么不做任何處理。
其中 UIView不接受事件處理的情況主要有以下三種
1)alpha <0.01
2)userInteractionEnabled = NO
3.hidden = YES




以下來自網絡:
響應者鏈條概念: iOS系統檢測到手指觸摸(Touch)操作時會將其打包成一個UIEvent對象,並放入當前活動Application的事件隊列,單例的UIApplication會從事件隊列中取出觸摸事件並傳遞給單例的UIWindow來處理,UIWindow對象首先會使用hitTest:withEvent:方法尋找此次Touch操作初始點所在的視圖(View),即需要將觸摸事件傳遞給其處理的視圖,這個過程稱之為hit-test view。


UIResponder 是所有響應對象的基類,在UIResponder類中定義了處理上述各種事件的接口。我們熟悉的 UIApplication、 UIViewController、 UIWindow 和所有繼承自UIView的UIKit類都直接或間接的繼承自UIResponder,所以它們的實例都是可以構成響應者鏈的響應者對象。


UIWindow實例對象會首先在它的內容視圖上調用hitTest:withEvent:,此方法會在其視圖層級結構中的每個視圖上調用pointInside:withEvent:(該方法用來判斷點擊事件發生的位置是否處於當前視圖范圍內,以確定用戶是不是點擊了當前視圖),如果pointInside:withEvent:返回YES,則繼續逐級調用,直到找到touch操作發生的位置,這個視圖也就是要找的hit-test view。


hitTest:withEvent:方法的處理流程如下: 
首先調用當前視圖的pointInside:withEvent:方法判斷觸摸點是否在當前視圖內; 
若返回NO,則hitTest:withEvent:返回nil; 
若返回YES,則向當前視圖的所有子視圖(subviews)發送hitTest:withEvent:消息,所有子視圖的遍歷順序是從最頂層視圖一直到到最底層視圖,即從subviews數組的末尾向前遍歷,直到有子視圖返回非空對象或者全部子視圖遍歷完畢; 
若第一次有子視圖返回非空對象,則hitTest:withEvent:方法返回此對象,處理結束; 
如所有子視圖都返回非,則hitTest:withEvent:方法返回自身(self)。 


一次完整的觸摸事件的傳遞響應的過程
UIApplication --> UIWindow --> 遞歸找到最適合處理事件的控件
控件調用touches方法 --> 判斷是否實現touches方法 --> 沒有實現默認會將事件傳遞給上一個響應者 --> 找到上一個響應者
PS:如果直到UIApplication都不響應,那么這個事件就被廢棄了。
1.響應者鏈條:由很多響應者鏈接在一起組合起來的一個鏈條
響應者:繼承自UIResponder的對象稱之為響應者對象
2.上一個響應者(默認做法是將事件順着響應者鏈條向上傳遞,將事件交給上一個響應者進行處理) 
如何判斷當前響應者的上一個響應者是誰?
1>判斷當前是否是控制器的View,如果是,上一個響應者就是控制器
2>如果當前不是控制器的View,上一個響應者就是父控件
3.響應者鏈條有什么用?
可以讓一個觸摸事件發聲的時候讓多個響應者同時響應該事件
在子類的實現文件里的touchesBegan:方法里加上如下代碼即可
[super touchesBegan:touches withEvent:event]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM