2012-03-22 13 views
17

Czy można zastąpić ikonę pinezki adnotacji dynamiczną etykietą tekstową?Zastąpić pinezkę ikony etykietą tekstową w adnotacji?

Może używając css lub dynamicznie tworząc obraz?

Na przykład etykieta jest wykonywana za pomocą CSS w Google Maps API z JavaScript.

+0

Witam, spróbuj opracować nieco więcej. Może jakiś kod z tego, co wypróbowałeś. –

Odpowiedz

30

Tak, jest to możliwe.

W systemie iOS MapKit należy zastosować metodę delegowania viewForAnnotation i zwrócić wartość MKAnnotationView z dodanym UILabel.

Na przykład:

-(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; 
} 

Upewnij widoku mapy za delegate właściwość jest ustawiona w przeciwnym razie ta metoda delegat nie będzie sprawdzony i dostaniesz domyślne czerwone szpilki zamiast.

+0

Dziękuję bardzo za szybką reakcję. Wkrótce przetestuję ten kod. Do zobaczenia wkrótce. – joumerlin

+0

Działa dobrze, thx ... – joumerlin

2

Oto wersja Swift 3 metody delegatów wspomniana powyżej w komentarzu Anna. Upewnij się, że twoja klasa jest zgodna z MKMapViewDelegate i że delegat mapView jest ustawiony na self w 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 
} 
Powiązane problemy