類似的問題之前就有遇到過,最近在做項目其中一個模塊的適配時,又遇到了,趁此機會總結一下。
可能引起此問題的原因:
1. 按鈕的frame 超出了 superview 的 frame, 我就是因為這個原因導致的點擊無響應。UIButton 還是可以顯示,但是因為觸摸事件的傳遞是從父控件傳遞到子控件,。
當一個控件接收到事件時, 就會調用它自己的- (nullableUIView*)hitTest:(CGPoint)point withEvent:(nullableUIEvent*)event 方法,這個方法會在其視圖層級結構中的每個視圖上遞歸地調用- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent*)event來判斷點擊事件發生的位置是否處于當前視圖范圍內,并且首先調用當前視圖的pointInside:withEvent:方法判斷觸摸點是否在當前視圖內, 如果點擊位置在父視圖外,那么此方法就會返回 NO, 那么hitTest:withEvent:方法就會返回nil, 也就是找不到合適的視圖來處理這個點擊事件,事件就被摒棄了, 沒有響應。
官方文檔中關于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."還指出以下三種情況下也會造成無響應的情況:
2. 控件隱藏了,不過我們既然是點擊 button 沒有反應 自然是沒有隱藏掉。
3. 用戶交互沒有打開, 一般按鈕的用戶交互是打開的,那么這時候可以看看父視圖的用戶交互是否是打開的。
4. 透明度低于0.01, 這樣控件也是無法響應的。有時候可能是它上邊有一層透明視圖遮蓋上了當事控件。
這是我的一些總結,希望能對大家有所幫助。