1.集成百度地图时需要在地图上显示多个地点的自定义标签,popView满足不了需求,一次只能出现选中的一个,我们需要自定义标签。
2.自定义View继承自BMKPinAnnotationView,可以显示多个自定义的view,但发现view中的按钮以及手势事件都没效果不响应。应该是百度地图的BMKPinAnnotationView重写了hitTest方法导致不响应,自己可以测试。解决方法在自己自定义view中重写hitTest方法
//在自定义view上添加事件拦截
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"hitTest=======================");
// 当touch point是在_btn上,则hitTest返回_btn
//1.获取这个点击位置转换按钮上的位置
CGPoint btnPointInA = [arrowImageBtnconvertPoint:pointfromView:self];
//2.判断这个转换后的位置是不是在这个按钮里 在这个按钮里返回这个按钮事件 hitTest和pointInside一般成对出现 hitTest方法由于会递归调用,有多少个子View调用多少次,所以这个方法里尽量不要写太复杂逻辑,以免处理不当效率低
if ([arrowImageBtnpointInside:btnPointInAwithEvent:event])
{
NSLog(@"button=======================");
returnarrowImageBtn;
}
// 否则,返回默认处理
return [superhitTest:pointwithEvent:event];
}
3.重写hitTest方法一些高级事件的处理,直接返回高级控件如(webview和mapview),这些控件是不会响应的,判断在这些高级控件的区域内返回
[super hitTest:point withEvent:event]; 才能响应事件。
//地图显示 响应区域在图片范围内的处理
if (CGRectContainsPoint(mapView.frame, point)) {
//当mapview在业务视图后面的时候 响应区域在业务区域的时候 让venusView去处理
if (!CGRectContainsPoint(CGRectMake(0, 100, 320, 380), point)&&routeSearch.isShowBack) {
// NSLog(@"LBLog 地图在显示 应该业务区域响应");
venusView.userInteractionEnabled=YES;
return venusView;
}
//1.地图区域响应 让上面的venusView不接受响应事件 不处理 在他响应区域内的时候在设置成YES 响应事件
venusView.userInteractionEnabled=NO;
//2.不能直接返回mapview(类似高级控件) 调用继承方法去处理复杂的view
return [super hitTest:point withEvent:event];
}