这是一篇废话连篇的简书,但可以帮助你解决进来时所带有的疑惑。
在开发过程中,通常会导致我们的button点击失效的情况有很多种,这里会着重讲一下其中一种:在视图最终显示的时候,由于button.frame超出了父视图的frame而引起的点击事件无响应。
在探究其失效原因之前,我们需要先来简单提及一下点击效果之后产生的事件分发机制。
当我们手指触摸屏幕后会发生怎么的故事呢?
首先触摸事件会被封装成一个UIEvent事件,去当前iOS操作系统的active app队列中取当前活跃的APP,把event传递给它;接着event会被依次传递给UIApplication-->UIWindow.rootviewController;这个时候rootviewController就会调用所有subviews的hitTest:event:方法,没错请记住这个方法;传给他之后系统会观察并判断哪一个view的hitTest:event:方法所返回的是非nil值,非nil值,非nil值,那么我们的event事件就会交由他来处理。
这里有篇关于时间分发机制的详情及举例的博客,有兴趣的猿哥猿姐们可以click看看点我就可以。
让我们来见识一下这个方法:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
return view;
}
那么再结合我们本文的核心问题--button的点击事件无响应,出现这样的情况我们可以猜想到,在我们点击按钮之后,系统调用hitTest方法所返回的view为nil,为nil,为nil,这其实就是为什么会没有响应的原因。
分析完问题,那么我们现在就来思考如何解决这个问题,其实很简单,就是要依靠我们的智慧让hitTest所返回的view不为nil,不为nil,不为nil。
怎么做,做判断!不废话,直接上代码。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == nil) {
//btn即为我们超出父视图范围的按钮
CGPoint tempoint = [btn convertPoint:point fromView:self];
if (CGRectContainsPoint(btn.bounds, tempoint)) {
view = btn;
}
}
return view;
}
问题就解决了