在项目中遇到这样一个需求,在点击区域选择按钮的时候会显示当前的 区域范围(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;
最后一个问题,当我们先点击特殊区域中心点(蓝色大头针及泡泡)然后再点击区域选择按钮(绿色大头针及泡泡),这时绿色不会显示,需要将前一个大头针取消显示,再点击才有效,或者点击区域选择按钮两次,这也是无法接受的。如下图:
// 取消所有标注的选中状态
for (id <BMKAnnotation> annotation in _mapView.annotations) {
[_mapView deselectAnnotation:annotation animated:NO];
}
这样,进而解决了中心位置问题、界面反复移动问题、前一个大头针泡泡仍继续展示问题。
总结来说,百度地图的iOS API确实写的不如安卓端完善,这些很简单的功能在安卓均提供有接口解决方案,但iOS端解决起来就费事了很多,用了一些看似不相关的属性参数。希望遇到类似问题的盆友可以得到帮助,一些百度地图API的其他使用问题也可以在评论下面交流,看到留言会一一回复。