按鈕沒法點擊

若是在UIImageView中添加了一個按鈕,你會發如今默認狀況下這個按鈕是沒法被點擊的,須要設置UIImageView的userInteractionEnabled爲YES:

imageView.userInteractionEnabled = YES;數組

設置爲YES後,UIImageView內部的按鈕就能夠被點擊了ide

緣由分析:spa

• 當用戶點擊屏幕時,會產生一個觸摸事件,系統會將該事件加入到一個由UIApplication管理的事件隊列中對象

• UIApplication會從事件隊列中取出最前面的事件進行分發以便處理,一般,先發送事件給應用程序的主窗口(UIWindow)繼承

• 主窗口會調用hitTest:withEvent:方法在視圖(UIView)層次結構中找到一個最合適的UIView來處理觸摸事件隊列

(hitTest:withEvent:實際上是UIView的一個方法,UIWindow繼承自UIView,所以主窗口UIWindow也是屬於視圖的一種)事件

• hitTest:withEvent:方法大體處理流程是這樣的:ip

首先調用當前視圖的pointInside:withEvent:方法判斷觸摸點是否在當前視圖內:it

▶ 若pointInside:withEvent:方法返回NO,說明觸摸點不在當前視圖內,則當前視圖的hitTest:withEvent:返回nilio

▶ 若pointInside:withEvent:方法返回YES,說明觸摸點在當前視圖內,則遍歷當前視圖的全部子視圖(subviews),調用子視圖的hitTest:withEvent:方法重複前面的步驟,子視圖的遍歷順序是從top到bottom,即從subviews數組的末尾向前遍歷,直到有子視圖的hitTest:withEvent:方法返回非空對象或者所有子視圖遍歷完畢:

▷ 若第一次有子視圖的hitTest:withEvent:方法返回非空對象,則當前視圖的hitTest:withEvent:方法就返回此對象,處理結束

▷ 若全部子視圖的hitTest:withEvent:方法都返回nil,則當前視圖的hitTest:withEvent:方法返回當前視圖自身(self)

• 最終,這個觸摸事件交給主窗口的hitTest:withEvent:方法返回的視圖對象去處理

我大體畫了個iOS觸摸事件分發的原理圖:

• hitTest:withEvent:方法會忽略如下視圖:

1> 隱藏(hidden=YES)的視圖

2> 禁止用戶操做(userInteractionEnabled=NO)的視圖

3> alpha<0.01的視圖

4> 若是一個子視圖的區域超過父視圖的區域(若是父視圖的clipsToBounds屬性爲NO,超過父視圖區域的子視圖內容也會顯示),那麼正常狀況下在父視圖區域外的觸摸操做不會被識別,由於父視圖的pointInside:withEvent:方法會返回NO,這樣就不會繼續向下遍歷子視圖了。固然,也能夠重寫pointInside:withEvent:方法來處理這種

綜上所述可得:若是父視圖的userInteractionEnabled=NO,觸摸事件不會繼續往下傳遞給子視圖,因此子視圖永遠沒法處理觸摸事件。而UIImageView在默認狀況下的userInteractionEnabled就是NO。

相關文章
相關標籤/搜索