The Responder Chain(響應鏈)

響應鏈是什麼,響應鏈是由響應者(Responder object)之間的touch消息傳遞以及檢測組成,咱們也能夠理解爲響應鏈是由響應者組成。html

 

在開發過程當中咱們所關注的是,在屏幕上點擊後,這個點擊該由哪一個對象來響應以及對象是怎麼樣接受到這個點擊事件的。ios

 

在理解響應鏈的時候,咱們要先了解下hit-test view,從表面意思能夠看出就是接受點擊測試的視圖。在發生一個點擊事件的時候,UIApplication對象會從隊列的頂部獲取到這個事件,在把這個事件分配給能夠處理這個事件的視圖。 事件會由一個指定的途徑傳遞,一直到事件能夠響應,若是響應鏈走了一遍,沒有發現能夠接收事件的視圖,那麼該事件就會被丟棄。若是有視圖能夠響應這個事件,這個視圖就是hit-test view,發現hit-test view的這個過程稱爲hit-testing.app

 

在開發中咱們,可能會用到下面這2個函數ide

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event函數

 

這個是用來當前在view hierarchy中的view是否包含指定的點。測試

這個函數通常狀況下不多直接調用,通常都是重寫這個方法來處理視圖中子視圖的touch事件。若是你重寫了這個函數,那麼就要注意了,你設置view的user interactions,hidden,alpha,對於他是不起做用的,就是無論你怎麼設置,這個函數都會一直進入。因此這是個蛋疼的地方,使用的時候要切記這個,否則你會有驚喜的。url

 

另外你添加了子視圖,可是clipsToBounds是NO的狀況下,當你點擊子視圖超出view的部分,是不會響應的,點擊區域只有在view的bounds中才會響應的。這也是要注意的。htm

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event對象

這個函數返回bool值,來反映當前point是否在view中。一般都是在上面- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event的函數調用此方法。blog

 

上面2個函數通常狀況下,使用的很少,除非是特殊狀況下(變態的需求)纔會使用。

 

接下來來講下當一個touch事件發生後,hit-testing是若是檢測到哪一個視圖響應的。

hit-testing在檢測hit-test view的時候,會遍歷view的全部子視圖來判斷是哪一個視圖包含當前的點擊點。一旦檢測到hit-test view,就會傳遞touch事件給視圖去處理。

 

 

下面經過一個例子來詳細看下。

The <wbr>Responder <wbr>Chain(響應鏈)

在上面的圖片中,若是touch點擊的時候,是點擊在view E裏面。則檢測過程是

1.首先是touch點在view A的bounds中,接下來檢測view B和view C.

2.檢測到touch點不在view B,在view C中,接下來檢測view D和view E.

3.檢測到touch點不在view D中,在view E中。

此時hit-testing過程已經完成,view E就是hit-test View.

 

檢測到hit-test View後,此view擁有優先處理事件的權利,若是view不能處理這個事件,事件就會沿着響應者鏈向下傳遞,直到找到一個能處理該事件的view.

那這個傳遞過程是怎麼樣的呢,咱們就要知道The Responder Chain的組成了,在開頭的時候已經說了(我的理解)。

下面給個確切的定義(from apple document):The responder chain is a series of linked responder objects。

響應鏈的起始點是,hit-test view(起點)和UIApplication對象(終點)。

下面來看下響應鏈的具體傳遞

The <wbr>Responder <wbr>Chain(響應鏈)

能夠看出,傳遞的方向就是從最上面的view向下傳遞,若是view是view controller的view,還會通過view controller以後在向下傳遞,最終到達app對象。

相關文章
相關標籤/搜索