Как мне поставить нужную кнопку аксессуара на выноску текущего местоположения? - PullRequest
2 голосов
/ 03 февраля 2012

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

- (MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
        //TODO: this doesn't seem to be working?  
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        MKAnnotationView * aV = [mapView viewForAnnotation:annotation];
        aV.canShowCallout = YES;
        aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        return nil;
    }
    return nil;
}

Я читал в нескольких местах, что решение состоит в том, чтобы создать пользовательский MKAnnotationView для местоположения пользователя, но я не видел демонстрации того, как это делается для местоположения пользователя - я успешно сделал это для другие аннотации на моей карте.

Пример кода будет наиболее полезным, спасибо!

Ответы [ 2 ]

9 голосов
/ 04 февраля 2012

Снова вы должны получить ссылку на вид аннотации местоположения пользователя. Следующие методы вызываются в iOS> = 5

Вариант 1

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
    MKAnnotationView *aV; 
     for (aV in views) {
           if ([aV.annotation isKindOfClass:[MKUserLocation class]]) {
                MKAnnotationView* annotationView = aV;
                annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            }
     }
}

См. Также метод делегата ниже

Альтернативный метод

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
     MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation];   
     annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
}

Обязательно добавьте метод делегата, чтобы вы могли делать все, когда нажата кнопка вызова:

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

В любой iOS любой из этих методов вызывается, и вы можете добавить правую / левую кнопку доступа к нему. убедитесь, что вы не добавили эту кнопку дважды, проверив счетчик подпредставлений представления аннотации местоположения пользователя.

Вы также можете добавлять / удалять дополнительные изображения, просматривая их во время выполнения, но я думаю, что вы не захотите их удалять. Кнопки

1 голос
/ 03 февраля 2012

Ваша главная проблема в том, что вы возвращаете ноль в обоих случаях.Вам также следует использовать идентификатор повторного использования.

- (MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id<MKAnnotation>)annotation
 {

 if ([annotation isKindOfClass:[MKUserLocation class]]) {
    MKAnnotationView * aV = [mapView dequeueReusableAnnotationViewWithIdentifier:@"locationView"];
    if (aV == nil) 
       aV = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationView"];
    aV.canShowCallout = YES;
    aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    return aV;
  }
return nil;
}

Вам также потребуется реализовать:

- (void)mapView:(MKMapView *)_mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

для поведения аксессуара выноски.

...