Заменить значок булавки текстовой меткой в ​​аннотации? - PullRequest
18 голосов
/ 22 марта 2012

Можно ли заменить значок булавки аннотации на динамическую текстовую метку?

Может быть, используя CSS или динамически создавая изображение?

Например, метка выполняется с помощью CSS в API Карт Google с помощью JavaScript.

Ответы [ 2 ]

31 голосов
/ 22 марта 2012

Да, это возможно.

В iOS MapKit вам необходимо реализовать метод делегата viewForAnnotation и вернуть MKAnnotationView с добавленным UILabel.

Например:

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

    static NSString *reuseId = @"reuseid";
    MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (av == nil)
    {
        av = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId] autorelease];

        UILabel *lbl = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 30)] autorelease];
        lbl.backgroundColor = [UIColor blackColor];
        lbl.textColor = [UIColor whiteColor];
        lbl.alpha = 0.5;
        lbl.tag = 42;
        [av addSubview:lbl];

        //Following lets the callout still work if you tap on the label...
        av.canShowCallout = YES;
        av.frame = lbl.frame;
    }
    else
    {
        av.annotation = annotation;
    }

    UILabel *lbl = (UILabel *)[av viewWithTag:42];
    lbl.text = annotation.title;        

    return av;
}

Убедитесь, что свойство delegate представления карты установлено, в противном случае этот метод делегата не будет вызван, и вы получите вместо него красные контакты по умолчанию.

2 голосов
/ 26 февраля 2017

Вот вариант Swift 3 метода делегата, упомянутый в комментарии Anna выше.Убедитесь, что ваш класс соответствует MKMapViewDelegate и что делегат mapView установлен на self в viewDidLoad ().

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is MKUserLocation {
        return nil
    }

    let reuseId = "reuseid"
    var av = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
    if av == nil {
        av = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        let lbl = UILabel(frame: CGRect(x: 0, y: 0, width: 50, height: 30))
        lbl.backgroundColor = .black
        lbl.textColor = .white
        lbl.alpha = 0.5
        lbl.tag = 42
        av?.addSubview(lbl)
        av?.canShowCallout = true
        av?.frame = lbl.frame
    }
    else {
        av?.annotation = annotation
    }

    let lbl = av?.viewWithTag(42) as! UILabel
    lbl.text = annotation.title!

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