類似的問題之前就有遇到過,最近在做項(xiàng)目其中一個(gè)模塊的適配時(shí),又遇到了,趁此機(jī)會總結(jié)一下旷赖。
可能引起此問題的原因:
1. 按鈕的frame 超出了 superview 的 frame, 我就是因?yàn)檫@個(gè)原因?qū)е碌狞c(diǎn)擊無響應(yīng)顺又。UIButton 還是可以顯示,但是因?yàn)橛|摸事件的傳遞是從父控件傳遞到子控件,。
當(dāng)一個(gè)控件接收到事件時(shí), 就會調(diào)用它自己的- (nullableUIView*)hitTest:(CGPoint)point withEvent:(nullableUIEvent*)event 方法,這個(gè)方法會在其視圖層級結(jié)構(gòu)中的每個(gè)視圖上遞歸地調(diào)用- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent*)event來判斷點(diǎn)擊事件發(fā)生的位置是否處于當(dāng)前視圖范圍內(nèi)等孵,并且首先調(diào)用當(dāng)前視圖的pointInside:withEvent:方法判斷觸摸點(diǎn)是否在當(dāng)前視圖內(nèi), 如果點(diǎn)擊位置在父視圖外,那么此方法就會返回 NO, 那么hitTest:withEvent:方法就會返回nil, 也就是找不到合適的視圖來處理這個(gè)點(diǎn)擊事件,事件就被摒棄了, 沒有響應(yīng)稚照。
官方文檔中關(guān)于hitTest:withEvent有這么一句話:"Points that lie outside the receiver’s bounds are never reported as hits, even if they actually lie within one of the receiver’s subviews."
并且官方文檔中"This method ignores view objects that are hidden, that have disabled user interactions, or have an alpha level less than0.01."還指出以下三種情況下也會造成無響應(yīng)的情況:
2. 控件隱藏了,不過我們既然是點(diǎn)擊 button 沒有反應(yīng) 自然是沒有隱藏掉。
3. 用戶交互沒有打開, 一般按鈕的用戶交互是打開的,那么這時(shí)候可以看看父視圖的用戶交互是否是打開的俯萌。
4. 透明度低于0.01, 這樣控件也是無法響應(yīng)的果录。有時(shí)候可能是它上邊有一層透明視圖遮蓋上了當(dāng)事控件。
這是我的一些總結(jié),希望能對大家有所幫助咐熙。