记录一下:假如一个 UIView(我们称作 FatherView),有一个 subview(我们称作 ChildView),这个 ChildView 在 FatherView 的 frame 外部,那么默认情况下,这个 ChildView 被点击的时候,并不会触发 FatherView 的点击响应链(这是合情合理的,FatherView 所在的位置都没被点击,它不遍历 subviews,不作回应是正常的),这时候怎样才能让这个 ChildView 相应点击事件?
其实思路是很简单的,监控屏幕上的所有点击事件的区域,如果这个区域和我们的 UIView 以及其 subview 的 CGRect 有重合,就作出反应。
** UIKit 提供了一个现成的方法来做到这件事:**
在自定义的UIView视图类中 重写如下代码
不说废话了上代码
Swift
import UIKit
class FatherView: UIView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
print("Detect Touch Event")
if (self.isHidden == false) && (alpha > 0) {
for subview in subviews {
if subview.frame.contains(point) {
if subview.isKind(of: ChildView1.self) {
print("view 1")
return subview
}
if subview.isKind(of: ChildView2.self) {
print("view 2")
return subview
}
}
}
}
return nil
}
}
iOS
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == nil) {
//将坐标由当前视图发送到 指定视图 fromView是无法响应的范围小父视图
CGPoint stationPoint = [_ChildView1 convertPoint:point fromView:self];
if (CGRectContainsPoint(_ChildView1.bounds, stationPoint))
{
view = _ChildView1;
}
}
return view;
}