您的位置:首页 > 移动开发 > IOS开发

iOS 【关于百度地图大头针标记 选中状态/点击状态 的区别及处理办法】

2017-04-11 12:07 471 查看
在项目中遇到这样一个需求,在点击区域选择按钮的时候会显示当前的 区域范围(BMKPolylineView) 以及 行政区域中心(大头针),并且大头针要显示出气泡展示当前区域车辆信息。如图:



细心的朋友可能发现,地图的中心应该是该区域的地理中心,而非我们获取到的行政中心。但是问题在于我们在弹出行政中心(绿色大头针)的泡泡时,是调用了:

// 选定大头针,弹出车辆数目
[self.mapView selectAnnotation:_scopePoint animated:NO];


而这句话的作用有二:① 显示泡泡(使大头针变为选中状态) ② 点击该大头针(使大头针变为点击状态)
但是大头针一旦成为了点击状态,那么就默认使该点击的大头针作为当前地图的中心点,显然这不是我们想要的。
为了让大头针选中弹出泡泡,并且不会让地图的中心点移动到该大头针的位置,我们做如下处理:
在大头针 BMKAnnotationView 初始化的代理方法中将该大头针的 view 的触摸事件取消。

/**
*根据anntation生成对应的View
*@param mapView 地图View
*@param annotation 指定的标注
*@return 生成的标注View
*/
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation;


annotationView.enabled = NO;


因为大头针的触摸事件和大头针是否显示弹窗是两个事件,所以彼此互不影响。

又出现了一个新的情况,那就是在不断切换区域的时候,会重新定位到行政区域中心的位置,然后再跳转到地理区域中心的位置。这样一来,界面会卡顿,定位两次的效果也不是很美观。我们仍旧可以在上面的代理方法中去如下设置:
让该大头针的选中状态设置为YES,可完美解决。

annotationView.selected = YES;


最后一个问题,当我们先点击特殊区域中心点(蓝色大头针及泡泡)然后再点击区域选择按钮(绿色大头针及泡泡),这时绿色不会显示,需要将前一个大头针取消显示,再点击才有效,或者点击区域选择按钮两次,这也是无法接受的。如下图:



前一秒点击的 “海上世界” 的泡泡并没有消失,而且跟随界面移动,后一秒的行政区域中心泡泡同时显示。要解决这个bug,我们要在每次点击区域按钮时遍历界面上的大头针,并设置取消选中状态。(而非移除)

// 取消所有标注的选中状态
for (id <BMKAnnotation> annotation in _mapView.annotations) {
[_mapView deselectAnnotation:annotation animated:NO];
}


这样,进而解决了中心位置问题、界面反复移动问题、前一个大头针泡泡仍继续展示问题。

总结来说,百度地图的iOS API确实写的不如安卓端完善,这些很简单的功能在安卓均提供有接口解决方案,但iOS端解决起来就费事了很多,用了一些看似不相关的属性参数。希望遇到类似问题的盆友可以得到帮助,一些百度地图API的其他使用问题也可以在评论下面交流,看到留言会一一回复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息