类似的问题之前就有遇到过,最近在做项目其中一个模块的适配时,又遇到了,趁此机会总结一下。
可能引起此问题的原因:
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, 这样控件也是无法响应的。有时候可能是它上边有一层透明视图遮盖上了当事控件。
这是我的一些总结,希望能对大家有所帮助。