【问题标题】:How to suppress the "Current Location" callout in map view如何在地图视图中抑制“当前位置”标注
【发布时间】:2012-01-09 06:56:10
【问题描述】:

点击代表 userLocation 的脉动蓝色圆圈会弹出“当前位置”标注。有没有办法抑制它?

【问题讨论】:

    标签: ios mkmapview mkmapviewdelegate


    【解决方案1】:

    在用户位置更新后,您可以更改注释视图上的一个属性:

    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    {
        MKAnnotationView *userLocationView = [mapView viewForAnnotation:userLocation];   
        userLocationView.canShowCallout = NO;
    }    
    

    【讨论】:

    • 有时无法确定位置,MKUserLocation 变为灰色。在这种情况下,标注仍会显示。这个答案不正确。
    • 在 iOS 10 上单独执行此操作对我不起作用。在 viewForAnnotation 中处理有效。
    【解决方案2】:

    您可以将title 设置为空白以禁止标注:

    mapView.userLocation.title = @"";
    


    编辑:
    更可靠的方法可能是在 didUpdateUserLocation 委托方法中将标题留空:

    -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    {
        userLocation.title = @"";
    }
    

    viewForAnnotation:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>) annotation
    {
        if ([annotation isKindOfClass:[MKUserLocation class]])
        {
            ((MKUserLocation *)annotation).title = @"";
            return nil;
        }
    
        ...
    }
    

    在委托方法中设置标题可让您确定您有一个真实的 userLocation 实例可供使用。

    【讨论】:

    • 谢谢!我知道我可以更改标题和副标题,但不知道将标题设置为空白字符串会抑制它。
    • @jowie 的回答更好。请改用该方法。
    • @Anna 一直在摆弄,但没有成功 - 关于如何完全抑制默认标注气泡的任何想法(如上所述,是的,@jowie 回答可能更好)而不阻止 mapView:didSelectedAnnotationView: 到被召唤?
    【解决方案3】:

    斯威夫特 4

    // MARK: - MKMapViewDelegate
    
    func mapViewDidFinishLoadingMap(_ mapView: MKMapView) {
        if let userLocationView = mapView.view(for: mapView.userLocation) {
            userLocationView.canShowCallout = false
        }
    }
    

    【讨论】:

    • mapView.view(for: mapView.userLocation) 似乎确实是最优雅的选择!您还可以在 mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) 回调中利用这一点,将其与所有其他注释视图组合在一起
    【解决方案4】:

    Swift 4 - Xcode 9.2 - iOS 11.2

    // MARK: - MKMapViewDelegate
    
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
      if let userLocation = annotation as? MKUserLocation {
        userLocation.title = ""
        return nil
      }
      // ...
    }
    

    【讨论】:

      【解决方案5】:

      我有两种方法可以帮助你:

      1. 在 mapViewDidFinishLoadingMap 中抑制

        func mapViewDidFinishLoadingMap(_ mapView: MKMapView) {
        mapView.showsUserLocation = true
        //suppress the title
        mapView.userLocation.title = "My Location"
        //suppress other params
        

        }

      2. 在 didUpdate 中抑制

        func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
            //suppress the title
            mapView.userLocation.title = "My Location"
            //suppress other params
        }
        

      【讨论】:

        【解决方案6】:

        SWIFT 版本

        mapView添加用户MKAnnotationView时,我们需要将用户MKAnnotationView属性canShowCallout设置为false

        func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
            for view in views {
                if view.annotation is MKUserLocation {
                    view.canShowCallout = false
                }
            }
        }
        

        【讨论】:

          【解决方案7】:

          嘿,有一个更新的简单解决方案

          斯威夫特:

          mapView.userLocation.title = "";
          

          .Net for iOS (Xamarin.iOS)

          NativeMap.UserLocation.Title = "";
          

          问候 ;)

          【讨论】:

          • 请不要对多个问题发布相同的答案。相反,针对所提出的问题定制答案。如果问题彼此完全相同,请投票/标记以关闭。
          猜你喜欢
          • 1970-01-01
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多