- 如果在UIImageView中添加一個按鈕,如下圖
按鈕作為圖片的子控件.png
你會發(fā)現,靠词疼,按鈕點擊不了了,沒錯確實是點擊按鈕不會有反應帘腹,因為UIImageView默認的userInteractionEnabled = NO
.所以要想圖片中的按鈕被點擊需要設置
imageView.userInteractionEnabled = YES;
那這到底時什么原因了贰盗,點擊事件時怎么傳遞的呢,下面讓我們先看一張事件傳遞的示例圖:
事件傳遞例子.png
看了上圖之后可能對事件傳遞有了一定的了解阳欲,下面讓我再具體的分析一下事件傳遞的過程舵盈,過程如下:
當用戶點擊屏幕時,會產生一個觸摸事件球化,系統(tǒng)會將該事件加入到一個由UIApplication管理的事件隊列中
UIApplication會從事件隊列中取出最前面的事件進行分發(fā)以便處理书释,通常,先發(fā)送事件給應用程序的主窗口(UIWindow)
-
主窗口會調用
hitTest:withEvent:
方法在視圖(UIView)層次結構中找到一個最合適的UIView來處理觸摸事件-
hitTest:withEvent:
其實是UIView的一個方法赊窥,UIWindow繼承自UIView,因此主窗口UIWindow也是屬于視圖的一種
-
-
hitTest:withEvent:
方法大致處理流程是這樣的:- 首先調用當前視圖的
pointInside:withEvent:
方法判斷觸摸點是否在當前視圖內: - 若
pointInside:withEvent:
方法返回NO爆惧,說明觸摸點不在當前視圖內,則當前視圖的hitTest:withEvent:
返回nil - 若
pointInside:withEvent:
方法返回YES锨能,說明觸摸點在當前視圖內扯再,則遍歷當前視圖的所有子視圖(subviews),調用子視圖的hitTest:withEvent:
方法重復前面的步驟,子視圖的遍歷順序
是從subviews數組的末尾向前遍歷址遇,直到有子視圖的hitTest:withEvent:
方法返回非空對象或者全部子視圖遍歷完畢
- 首先調用當前視圖的
若第一次有子視圖的
hitTest:withEvent:
方法返回非空對象,則當前視圖的hitTest:withEvent:
方法就返回此對象熄阻,處理結束若所有子視圖的
hitTest:withEvent:
方法都返回nil,則當前視圖的hitTest:withEvent:
方法返回當前視圖自身(self)最終倔约,這個觸摸事件交給主窗口的
hitTest:withEvent:
方法返回的視圖對象去處理
注意:hitTest:withEvent:方法會忽略以下視圖:
不接受觸摸的三種情況.png