iOS事件處理

1、事件的產生及傳遞

發生觸摸事件后,系統會將事件加入到一個由UIApplication管理的事件隊列中,

UIApplication會從事件隊列中取出最前面的事件,并將事件發放下去以便處理,通常先發送給應用程序的主窗口

主窗口會在視圖層次結構中選出最合適的試圖控件,來處理事件,這也是整個過程的第一步

找到合適的視圖控件后,就會調用最合適的視圖控件的touches方法來處理事件,


2、如何尋找最合適的視圖控件?

自己能否接受觸摸事件

觸摸點是否在自己身上

從后往前遍歷所有子控件,重復前兩步

如果沒有最合適的view,那么就自己最適合處理


3、事件的響應

? ? 找到最合適的view后調用touches方法,系統的默認做法是沿著響應者鏈條向上傳遞

? ? 3.1響應者鏈條

? ? 由多個響應者連接而成的鏈條

? ? 能清楚的觀察到每個響應者之間的關系,并且可以使一個事件可以被多個對象處理

? ? 3.2響應者

? ? 繼承自UIResponder的對象

? ? 具備處理事件的能力

? ? 3.3如何尋找上一個響應者

? ? 當前的view是控制器的view,那么上一個響應者就是控制器

? ? 當前的view不是控制器的view,那么上一個響應者就是父控件

? ? 找到上一個響應者,繼續調用上一個響應者的touches方法,以此類推


4.事件傳遞的完整過程

先將事件對象從上往下進行傳遞,(即父控件傳遞給子控件)找到最合適的視圖控件來處理事件

調用最合適的視圖控件的touches方法處理事件

如果調用了[super touches….];就會將事件順著響應者鏈條往上傳遞,傳遞給上一個響應者

接著就會調用上一個響應者的touches….方法


5.響應者鏈條的事件傳遞過程

如果view的控制器存在,就傳遞給控制器,如果view的控制器不存在,就傳遞給父控件

在視圖層次的最頂端如果也不能處理事件或消息,那么就將該事件傳遞給UIWindow對象

如果UIWindow對象也不能處理事件或消息,那么就將事件傳遞給UIApplication

如果UIApplication對象也不能處理事件或消息,那么就將事件丟棄


6.不能接收事件的五種方式

userInteractionEnabled == NO

hidden == YES

alpha <= 0.01

父控件不能接收事件

子控件超出父控件的尺寸

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容