1顺献、響應(yīng)鏈是什么時候創(chuàng)建的:
當一個view被add到superView上的時候姨丈,他的nextResponder屬性就會被指向它的superView迹卢,當controller被初始化的時候拗小,self.view(topmost view)的nextResponder會被指向所在的controller,而controller的nextResponder會被指向self.view的superView努隙,這樣球恤,整個app就通過nextResponder串成了一條鏈,也就是我們所說的響應(yīng)鏈荸镊。所以響應(yīng)鏈就是一條虛擬的鏈咽斧,并沒有一個對象來專門存儲這樣的一條鏈堪置,而是通過UIResponder的屬性串連起來的
2、事件處理流程
1 當用戶點擊屏幕時张惹,會產(chǎn)生一個觸摸事件晋柱,系統(tǒng)會將該事件加入到一個由UIApplication管理的事件隊列中
2 UIApplication會從事件隊列中取出最前面的事件進行分發(fā)以便處理,通常诵叁,先發(fā)送事件給應(yīng)用程序的主窗口(UIWindow)
3 主窗口會調(diào)用hitTest:withEvent:方法在視圖(UIView)層次結(jié)構(gòu)中找到一個最合適的UIView來處理觸摸事件
(hitTest:withEvent:其實是UIView的一個方法,UIWindow繼承自UIView钦椭,因此主窗口UIWindow也是屬于視圖的一種)
hitTest:withEvent:方法大致處理流程是這樣的:
(一) 首先調(diào)用當前視圖的pointInside:withEvent:方法判斷觸摸點是否在當前視圖內(nèi):
若pointInside:withEvent:方法返回NO拧额,說明觸摸點不在當前視圖內(nèi),則當前視圖的hitTest:withEvent:返回nil
若pointInside:withEvent:方法返回YES彪腔,說明觸摸點在當前視圖內(nèi)侥锦,則遍歷當前視圖的所有子視圖(subviews),調(diào)用子視圖的hitTest:withEvent:方法重復(fù)前面的步驟德挣,子視圖的遍歷順序是從top到bottom恭垦,即從subviews數(shù)組的末尾向前遍歷,直到有子視圖的hitTest:withEvent:方法返回非空對象或者全部子視圖遍歷完畢:
(二)若第一次有子視圖的hitTest:withEvent:方法返回非空對象,則當前視圖的hitTest:withEvent:方法就返回此對象格嗅,處理結(jié)束
若所有子視圖的hitTest:withEvent:方法都返回nil番挺,則當前視圖的hitTest:withEvent:方法返回當前視圖自身(self)
4 最終,這個觸摸事件交給主窗口的hitTest:withEvent:方法返回的視圖對象去處理