觸控事件:對於觸控事件,window物件會嘗試著首先將事件傳遞給觸控事件發生點得view。這個view被視為「命中測試view」 (hit-test view)。尋找「命中測試view」的過程被稱作「命中測試」,關於「命中測試」會在下面的命中測試返回觸控事件發生點的view有詳情描述。
手勢和遠端控制事件:對於這些事件,window物件傳送震動手勢或者遠端控制事件給第一響應者去處理,關於第一響應者的定義在下面的響應者鏈的構造中有詳情描述。最終所有的事件響應路徑都是為了去尋找那個能夠響應並處理該事件的物件。因此,uikit會首先傳送該事件給最適合處理該事件的物件。對於觸控事件,這個最適合處理的物件就是 hit-test view既「命中測試view」,並且對於其它事件,這個物件就是「第一響應者」。下面的幾個部分將詳細的解釋更多的關於「命中測試view」和第一響應者的選擇。
命中測試返回觸控事件發生點的view
ios使用「命中測試」(hit-testing)去尋找觸控發生下的view。命中測試會執行檢測判斷是否改觸控點發生在某個具體的view的相對邊界之內。如果檢測是的,它就會遞迴的去檢測該view的所有子view。該view的層級最底端view包含觸控點,它就成為了「命中測試view」。之後ios就會決定誰是命中測試view,並且遞交觸控事件給它處理。
為了去闡明這個過程,假設使用者觸控 view e如圖2-1。ios會以這樣的順序去尋找命中測試view通過檢測所有的子view.
1. 觸控點是否在view a的邊界之內,如果是它會檢測子檢視b和c.圖:2-12. 觸控點不在view b的邊界之內,但是它在view c的邊界之內,因此它就去檢測c的子檢視d和e。
3. 觸控事件不在view d的邊界之內,但是在view e的邊界之內。view e是整個包含觸控事件的view層級中最底端的view,因此view e就名正言順的成為了「命中測試view」。
方法hittest:withevent傳入cgpoint和uievent返回命中測試view。這個方法hittest:withevent開始執行通過呼叫自身的pointinside:withevent方法。如果傳入hittest:withevent的point在view的邊界之內。pointinside:withevent方法就會返回yes。然後該方法會遞迴呼叫hittest:withevent方法在每乙個返回yes的子view上。
如果傳入的hittest:withevent的點不在view的邊界之內,首先會呼叫pointinside:withevent方法返回no,該point會被忽略,並且hittest:withevent返回nil,如果乙個子view返回no,那麼整個view層級的分支都會被忽略,因為如果觸控點沒有發生在子view,她也不可能發生在任何子view的子view。這就意味著任何子view上面的點都在邊界之外並且它的父view也不能接受觸控事件,因為觸控點必須同時在父view和子view的邊界之內。這種情況可能會發生,如果子view的clipstobound屬性設為no。
注意:乙個觸控事件物件將會被關聯於命中測試view的整個生命週期,即使這個觸控後來移到了view的邊界之外。命中測試view被賦予了第乙個處理觸控事件的機會,如果命中測試view不能處理該事件,該事件就會交付給view響應者鏈的上一級處理直到系統找到乙個能夠處理該事件的物件。
iOS事件傳遞 響應者鏈
事件傳遞 響應者鏈 對於觸控事件來說,window 會傳到 發生觸控的view,被稱之為hit test view。此過程叫 hit testing。對於手勢和遠端控制,這個第一響應被發到 first responder.最終響應者鏈要找到處理事件的物件。規則如下。1 hit testing 檢測的...
iOS 響應者鏈,事件的傳遞
先將事件物件由上往下傳遞 由父控制項傳遞給子控制項 找到最合適的控制項來處理這個事件。呼叫最合適控制項的touches 方法 如果呼叫了 super touches 就會將事件順著響應者鏈條往上傳遞,傳遞給上乙個響應者 接著就會呼叫上乙個響應者的touches 方法 如果當前這個view是控制器的v...
iOS事件傳遞和事件響應者鏈 20170810
區別 事件的傳遞和響應的區別 事件的傳遞是從上到下 父控制項到子控制項 事件的響應是從下到上 順著響應者鏈條向上傳遞 子控制項到父控制項。引出 當我們手指觸控螢幕的時候,ios系統是怎麼找到對應的圖層,並響應手勢的呢?事件的產生 主視窗會在檢視層次結構中找到乙個最合適的檢視來處理觸控事件,這也是整個...