怎么办?
Responder Chain 原理讲解:手指点击屏幕,经过系统响应(之前过程省略不说,文末有参考链接),调用 UIApplication 的 sendEvent: 方法,将 UIEvent 传给 UIWindow, 通过递归调用 UIView 层级的 hitTest(_:with:) ,结合 point(inside:with:) 找到 UIEvent 中每一个UITouch 所属的 UIView(其实是想找到离触摸事件点最近的那个 UIView)。这个过程是从 UIView 层级的最顶层往最底层递归查询。同一层级的 UIView,会优先深度遍历界面靠前的 UIView。找到最底层 UIView 后,沿着 Responder Chain 逐步向上传递(UIControl 子类默认会拦截传递)。
解决思路:重写 ZYYBarrageView 的 hitTest(_:with:) 方法。代码如下:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
BOOL isPointInsideSubview = [self.redView.layer.presentationLayer hitTest:point];
if (isPointInsideSubview == NO) {
// 如果没有点击在移动的 redView 上,返回 nil
// 系统会去遍历位于 ZYYBarrageView 后面的 UIButton,UIButton 能得到响应
return nil;
} else {
return [super hitTest:point withEvent:event];
}
}
如此,可以完美解决啦~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ASPKU的支持。
注:相关教程知识阅读请移步到IOS开发频道。










