Replace icon pin by text label in annotation?

后端 未结 2 932
逝去的感伤
逝去的感伤 2020-12-03 11:01

Is it possible to replace the pin icon of an annotation by a dynamic text label?

Maybe using css, or dynamically creating an image?

For example a label is do

相关标签:
2条回答
  • 2020-12-03 11:24

    Yes, it's possible.

    In iOS MapKit, you'll need to implement the viewForAnnotation delegate method and return an MKAnnotationView with a UILabel added to it.

    For example:

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

    Make sure the map view's delegate property is set otherwise this delegate method will not get called and you will get the default red pins instead.

    0 讨论(0)
  • 2020-12-03 11:37

    Here's a Swift 3 variation of the delegate method mentioned in Anna's comment above. Make sure your class conforms to MKMapViewDelegate and that the mapView's delegate is set to self in 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
    }
    
    0 讨论(0)
提交回复
热议问题