• iOS


    场景:
      在处理Marker点击事件时,此时地图上有Marker点A及Marker点B,当选中Marker点A后,SDK方法
    "didSelectAnnotationView"响应了点击事件,并进行了对应的逻辑处理(我在此进行了弹窗操作).
    当关闭弹窗想再次选中Marker点A,此时"didSelectAnnotationView"不再响应.需选中Maker点B
    后方法才会再次响应.也就是说当连续选中同一个Marker点时会导致"didSelectAnnotationView"
    出现不响应的情况.
    方案一:
      
    ///如果已经是选中状态,再次点击不会触发此回调。取消选中需调用
    -(void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view{
        [mapView deselectAnnotation:view.annotation animated:YES];
    }
    - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
    {
    //    [self.aOverlays addObject:annotation];
        if ([annotation isKindOfClass:[MAUserLocation class]]) {
            NSLog(@"用户定位点");
            if (self.startCoordinate.latitude == 0) {
                //            [self requestData:((MAUserLocation *)annotation).location.coordinate filed:@"priority"];
                self.startCoordinate = ((MAUserLocation *)annotation).location.coordinate;
                self.filed = @"2";//priority
                [self loadData];
            }
            self.startCoordinate = ((MAUserLocation *)annotation).location.coordinate;
            
            return nil;
        }
        if ([annotation isKindOfClass:[MAPointAnnotation class]])
        {
            static NSString *customReuseIndetifier = @"customReuseIndetifier";
            
            SDCustomAnnotationView *annotationView = (SDCustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:customReuseIndetifier];
            
            if (annotationView == nil)
            {
                annotationView = [[SDCustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:customReuseIndetifier];
                
            }
            kWeakSelf(self);
            annotationView.secletAnnotation = ^{
                NSInteger row = [weakself.annotations indexOfObject:annotation];
                NSLog(@"点击了---->%ld",(long)row);
            };
        annotationView.canShowCallout = YES;
            annotationView.image = nil;
            
            if ([annotation isKindOfClass:[MANaviAnnotation class]])
            {
                switch (((MANaviAnnotation*)annotation).type)
                {
                        //                case MANaviAnnotationTypeRailway:
                        //                    poiAnnotationView.image = [UIImage imageNamed:@"railway_station"];
                        //                    break;
                        //
                        //                case MANaviAnnotationTypeBus:
                        //                    poiAnnotationView.image = [UIImage imageNamed:@"bus"];
                        //                    break;
                        //
                        //                case MANaviAnnotationTypeDrive:
                        //                    poiAnnotationView.image = [UIImage imageNamed:@"car"];
                        //                    break;
                        //
                    case MANaviAnnotationTypeWalking:
                        [self.aOverlays addObject:annotation];
                        annotationView.image = [UIImage imageNamed:@"man_map"];
                        break;
                        //                case MANaviAnnotationTypeRiding:
                        //                    poiAnnotationView.image = [UIImage imageNamed:@"ride"];
                        //                    break;
                        //
                    default:
                        break;
                }
            }
            else
            {
                
                annotationView.image = [UIImage imageNamed:@"addr_map"];
                annotationView.count = annotation.subtitle;
            }
            
            return annotationView;
            
        }
      return nil;  
    }
    方案二:
      针对上述问题,可在创建Annotationview时给这个Annotationview添加Tap手势
    自己对事件进行处理不依赖SDK提供的方法
    /** 
      * @brief 根据anntation生成对应的View(设置标准样式) 
      * @param mapView 地图View 
      * @param annotation 指定的标注
      * @return 生成的标注View 
    */
    - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id)annotation
    {
        if ([annotation isKindOfClass:[MAPointAnnotation class]])
        {
           static NSString *pointDefaultIndentifier = @"pointDefaultIndentifier";
            AnnotationViewManager *annotationView = (AnnotationViewManager *)[mapView dequeueReusableAnnotationViewWithIdentifier:pointDefaultIndentifier];
            if (annotationView == nil)
            {
                annotationView = [[AnnotationViewManager alloc] initWithAnnotation:annotation reuseIdentifier:pointDefaultIndentifier];
                // 给Marker点添加手势
                [annotationView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMarkerClick:)]];
            }
            annotationView.centerOffset = CGPointMake(0, -18);
            annotationView.image = [UIImage imageNamed:@"map_tubiao_zuche_icon"];
            return annotationView;
        }
        return nil;
    }
    // Marker选中事件
    - (void)onMarkerClick:(UITapGestureRecognizer *)gesture
    {
        // 这里做你想的事情
        MAAnnotationView *annoView = (MAAnnotationView*)gesture.view;
        NSLog(@"选中了: %@",annoView.annotation.title);
     
        // 解决5.0.0上Annotation选中后重用的bug.
        if(annoView.annotation == self.mapView.selectedAnnotations.firstObject)
        {
            if(annoView.selected == NO)
            {   
                [annoView setSelected:YES animated:YES];
            }
            return;
        }
        else
        {
            [self.mapView selectAnnotation:annoView.annotation animated:YES];
        }
    }
  • 相关阅读:
    Angular2 表单
    PHP Windows环境部署
    CI 扩展 Service
    Angular2 组件生命周期
    linux 命令笔记
    CI 笔记一
    Angular2 管道
    Angular2 指令
    springboot整合Quartz实现动态配置定时任务
    vue-app开发入门
  • 原文地址:https://www.cnblogs.com/gongyuhonglou/p/10614221.html
Copyright © 2020-2023  润新知