iOS 高德地图固定屏幕点

先说一下实现的大致逻辑,大家可以看一下对自己是否有帮助的地方

1、通过定位得到用户当前位置,创建annotation并设置属性让其固定并显示在地图中心点(这样会和MAUserLocation重合,我们要在代理方法里面去掉MAUserLocation和设置用户位置精度圈,就是蓝圈)
2、自定义annotation图片
3、在地图移动结束后的回调方法里面通过相对于地图的坐标得到当前的经纬度
4、得到经纬度进行反地理编码,得到pois,展示列表
5、点击列表,将地图的中心点移至点击对应的经纬度。

代码:
1、初始化mapView

    MAMapView *mapView = [[MAMapView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 300)];
    mapView.delegate = self;
    [self.view addSubview:mapView];
    
    // 定位当前位置
    mapView.userTrackingMode = MAUserTrackingModeFollow;
    mapView.showsUserLocation = YES;
    mapView.zoomLevel = 17;

2、设置固定点

/* 位置或者设备方向更新后,会调用此函数 */
// 为了得到用户初始的位置,创建Annotation
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
    // 目的是只用第一次定位的数据,即用户的初始位置
    if (self.userFirstLoca == NO) {
        self.userFirstLoca = YES;
        self.userFirstCoor = userLocation.location.coordinate;
        
        MAPointAnnotation *ann = [[MAPointAnnotation alloc] init];
        ann.coordinate = userLocation.location.coordinate;
       //固定Annotation并放置地图中心点
        ann.lockedToScreen = YES;
        ann.lockedScreenPoint = CGPointMake(mapView.center.x, mapView.center.y-64);
        [mapView addAnnotation:ann];
    }
}

3、一是去掉MAUserLocation的大头针,二是自定义设置固定Annotation的图片

/* 根据anntation生成对应的View */
-(MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
    // 用户定位的annotation,置为空
    if ([annotation isKindOfClass:[MAUserLocation class]]) {
        MAAnnotationView *annView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"userLocationAnnViewID"];
        if (annView == nil) {
            annView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"userLocationAnnViewID"];
            annView.image = nil;
        }
        return annView;
    }else if ([annotation isKindOfClass:[MAPointAnnotation class]]) {
    // 固定Annotation自定义图片
        MAAnnotationView *annView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"annViewID"];
        if (annView == nil) {
            annView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annViewID"];
            annView.image = [UIImage imageNamed:@"endPoint@2x.png"];
        }
        return annView;
    }
    return nil;
}

4、地图移动结束后的回调方法里面通过相对于地图的坐标得到当前的经纬度。得到经纬度进行反地理编码,得到pois

/* 地图移动结束后调用此接口 */
- (void)mapView:(MAMapView *)mapView mapDidMoveByUser:(BOOL)wasUserAction
{
    // 将指定view坐标系的坐标转换为经纬度
    CLLocationCoordinate2D moveCoor = [mapView convertPoint:CGPointMake(mapView.center.x, mapView.center.y-64) toCoordinateFromView:mapView];
    
    // 通过坐标点得到经纬度,从而进行反地理编码
    AMapReGeocodeSearchRequest *rego = [[AMapReGeocodeSearchRequest alloc] init];  
    // 是否返回扩展信(因为我们需要得到附近地理位置信息,所以设为YES)
    rego.requireExtension = YES;
    rego.location = [AMapGeoPoint locationWithLatitude:moveCoor.latitude longitude:moveCoor.longitude];
    [self.searchAPI AMapReGoecodeSearch:rego];
}

5、反地理编码,得到pois展示列表,点击列表,将地图的中心点移至点击对应的经纬度

/* 逆地理编码查询回调函数 */
- (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
{
   // reGeodeVC就是一个简单的tableView布局,数据来源就是response.regeocode.pois
    [self.reGeodeVC reloadTableView:response.regeocode.pois];
}

/* 这个是reGeodeVC点击tableViewCell的回调 */
#pragma mark - ReGeocodeDelegate
-(void)selectAMapAPI:(AMapPOI *)poi
{
    // 将地图的中心点移至poi点
    [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(poi.location.latitude, poi.location.longitude) animated:YES];
}

另外:设置用户位置精度圈,去掉用户定位的蓝圈,可以自定义改变样式

    /* 是否自定义用户位置精度圈(userLocationAccuracyCircle)对应的 view, 默认为 NO.\n 如果为YES: 会调用 - (MAOverlayRenderer *)mapView (MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay 若返回nil, 则不加载.\n 如果为NO : 会使用默认的样式. */
    // 目的是去掉定位是的蓝圈,要在代理方法里面设置
    mapView.customizeUserLocationAccuracyCircleRepresentation = YES;
    /* 自定义用户位置精度圈触发的回调 */
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay
{
    // 判断是否为用户位置精度圈
    if (overlay == mapView.userLocationAccuracyCircle) {
        return nil;
    }
    return nil;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容