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。