настройка canShowCallOut = NO для аннотации текущего местоположения, iPhone - PullRequest
15 голосов
/ 09 декабря 2011

Я использую пользовательский вызов (название и субтитры) для значка текущего местоположения. Я попытался выполнить следующее, чтобы отключить аннотацию по умолчанию, но она не работает.

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

}

Единственный способ, которым он работает -

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)ann
{
    if([ann.annotation isKindOfClass:[MKUserLocation class]] )
    {
       [mymap deselectAnnotation:ann.annotation animated:NO];
    }
}

Но иногда это отстает. Есть ли другой способ отключить представление выноски по умолчанию для текущей аннотации местоположения? Любая помощь будет оценена.

Ответы [ 6 ]

28 голосов
/ 12 января 2012

Чтобы сделать это, нужно получить ссылку на текущее местоположение MKAnnotationView. Эту ссылку можно получить где угодно, но лучше получить ее, как только определится местоположение пользователя.

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

}

Или используйте следующий метод

 - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
MKAnnotationView *aV; 
     for (aV in views) {
            if ([aV.annotation isKindOfClass:[MKUserLocation class]]) {
                MKAnnotationView* annotationView = aV;
                 annotationView.canShowCallout = NO;

            }
    }

и если вы хотите изменить свойство canShowCallout во время выполнения, тогда можно использовать следующее

for (AnnotationClass* annotation in mapView.annotations) 
    {
        if([annotation isKindOfClass:[MKUserLocation class]] )
        {
             MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation];
             annotationView.canShowCallout = NO;
        }
    }
6 голосов
/ 18 февраля 2015

обновление к этому, используя swift (на основе ответа Chatur):

func mapView(mapView: MKMapView!, didAddAnnotationViews views: [MKAnnotationView]!) {

    for view in views {
        if view.annotation.isKindOfClass(MKUserLocation) {
            view.canShowCallout = false
        }
    }

}

Примечание: используя это, мне больше ничего не требовалось, чтобы это работало

2 голосов
/ 16 января 2017

Swift:

Это сработало для меня: просто добавьте этот метод делегата.

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
    for var view in views {
        view.canShowCallout = false
    }
}
1 голос
/ 07 мая 2017
// Objective-C

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

// Swift 4.2

func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
        let userAnnotationView = mapView.view(for: userLocation)
        userAnnotationView?.canShowCallout = false
}
1 голос
/ 13 января 2017

Это сработало для меня на Swift 3.0 / iOS 10.

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
    (views.filter { $0.isKind(of: MKUserLocation.self) }).first?.canShowCallout = false
}

Вместо того, чтобы перебирать все представления, я просто полагаюсь на команду filter, после чего сначала выполняется необязательный вызов, поскольку должно быть только одно местоположение, а затем устанавливается значение false.

0 голосов
/ 09 декабря 2011

РЕДАКТИРОВАТЬ

Извините, что понял вас неправильно.

Я ударился головой об этом.

Это единственный способ, которым мне удалось это сделать.проблема с этим методом состоит в том, что вы должны изменить представление UserLocation.Так что это может быть не так удобно для пользователя.

В любом случае:

 - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
if ([annotation isKindOfClass:[MKUserLocation class]]){

        MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation                                                                           reuseIdentifier:nil];
        annotationView.image = [UIImage imageNamed:@"your-icon.png"];
        annotationView.enabled=NO;
         return annotationView;
    };
     ........}

Пришлось бежать в детский сад, чтобы забрать моего ребенка :)

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...