iOS开发,第一次集成高德地图,实现了简单的定位,绘制气泡,导航。简单总结:
1.定位
只是为了获取当前位置(如果需要展示地图可以直接使用MAMapView,不用设置定位管理器),使用AMapLocationManager类,需要自行配置,如定位精度,频率,地理反编码是否需要,是否需要持续定位等等,如果设置持续定位那么单次定位的配置和方法就会被覆盖。
- (void)configLocationManager
{
self.locationManager = [[AMapLocationManager alloc] init];
//代理方法 ,持续定位的获取,定位失败的处理等
[self.locationManager setDelegate:self];
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
[self.locationManager setDistanceFilter:0];
[self.locationManager setPausesLocationUpdatesAutomatically:YES];
[self.locationManager setLocatingWithReGeocode:YES];
// [self.locationManager setAllowsBackgroundLocationUpdates:YES];
[self.locationManager setLocationTimeout:3.0];
[self.locationManager setReGeocodeTimeout:6.0];
//开始连续定位
[self.locationManager startUpdatingLocation];
//单次定位的方法
// [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
// <#code#>
// }];
}
2.展示地图
跟系统的地图使用方法类似,可以自己配置显示地图类型,区域,比例,中心点等。
- (void)initMapView{
///初始化地图
_mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
_mapView.delegate = self;
_mapView.showsScale = YES;
_mapView.showsCompass = YES;
MACoordinateSpan span = MACoordinateSpanMake(0.1, 0.1);
MACoordinateRegion region = MACoordinateRegionMake(_destinationCoordinate, span);
_mapView.region = region;
///如果您需要进入地图就显示定位小蓝点,则需要下面两行代码
_mapView.showsUserLocation = YES;
_mapView.userTrackingMode = MAUserTrackingModeFollow;
///把地图添加至view
_mapView.centerCoordinate = _destinationCoordinate;
[self.view addSubview:_mapView];
}
3.标记和气泡
即显示在地图上的大头针和大头针标注,默认的大头针可以自定义图片,气泡的自定义范围较小,如有需要可以继承MAPinAnnotationView,自定义属于自己的气泡即正常布局之后,在
-(void)setSelected:(BOOL)selected animated:(BOOL)animated;
中add到界面和赋值。
注意,不要忘了在最后加上 [super setSelected:selected animated:YES],否则大头针和气泡的点击交互无效。
具体聊聊在气泡添加点击事件遇到的坑:
因为需求,需要在气泡上添加一个导航按钮,可在自定义气泡上加了点击事件之后,点击按钮响应的却是大头针的事件,经过仔细研究发现,其实大头针的视图范围很小,气泡视图看似正常显示在界面上,实际它的位置已经超出父视图,只是超出部分没有被切掉,所以当我们的点击根本传达不到按钮。
解决方法
重写-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
* @brief 系统用来判定交互是应该由哪个view响应
* @param point 点击的位置,对于当前坐标系而言的
* @event event 点击事件
* @return 最佳响应事件的view
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == nil) {
//当前坐标系上的点转换到按钮上的坐标
CGPoint tempoint = [self.navBtn convertPoint:point fromView:self];
if (CGRectContainsPoint(self.navBtn.bounds, tempoint))
{
view = self.navBtn;
}
}
return view;
}
4.导航
高德的导航非常简单,根据不同出行方式选择不同的导航管理器和导航地图即可。然后在管理器的代理方法中处理导航,具体可参考官方demo,很详细。
以上全部仅供参考,不足之处欢迎指正。