MKMapKit UILabel作为注释

时间:2011-03-30 01:14:22

标签: ios objective-c uilabel mapkit

我认为这将是相当普遍的事情 - 但无法在任何地方找到它。 我知道如何将图像放在地图上。我使用了http://spitzkoff.com/craig/?p=81中的CSMapAnnotation。

我已经把CSMapAnnotationTypeImage作为一个例子并制作了一个CSMapAnnotationTypeLabel,但它只是在地图上显示引脚而不是像我预期的那样显示UILabel。

头文件

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>


@interface CSLabelAnnotationView : MKAnnotationView {
    UILabel* _label;
}
@property(retain, nonatomic)     UILabel* label;

@end

和源文件

#import "CSLabelAnnotationView.h"
#import "CSMapAnnotation.h"
#import "util.h"

@implementation CSLabelAnnotationView
@synthesize label = _label;

#define kWidth  120
#define kHeight 20

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    self.frame = CGRectMake(0, 0, kWidth, kHeight);
    self.backgroundColor = [UIColor clearColor];

    CSMapAnnotation* csAnnotation = (CSMapAnnotation*)annotation;   
    _label = [[UILabel alloc] initWithFrame:self.frame];
    _label.text=csAnnotation.title;
    [self addSubview:_label];
    return self;

}
#if 0
- (void)prepareForReuse
{
    TGLog(@"");
    [_imageView removeFromSuperview];
    [_imageView release];
}
#endif

-(void) dealloc
{
    [_label release];
    [super dealloc];
}
@end

将其添加到地图

annotation = [[[CSMapAnnotation alloc] initWithCoordinate:coordinate
                                               annotationType:CSMapAnnotationTypeLabel
                                                        title:i.name
                                              reuseIdentifier:@"ocualabel"] autorelease];   
    [_mapView addAnnotation:annotation];

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView* annotationView = nil;

    if (annotation == mapView.userLocation){
        return nil; //default to blue dot
    }

    // determine the type of annotation, and produce the correct type of annotation view for it.
    CSMapAnnotation* csAnnotation = (CSMapAnnotation*)annotation;
    TGLog(@"csAnnotation.annotationType %d", csAnnotation.annotationType);
    if(csAnnotation.annotationType == CSMapAnnotationTypeStart || 
       csAnnotation.annotationType == CSMapAnnotationTypeEnd)
    {
        NSString* identifier = @"Pin";
        MKPinAnnotationView* pin = (MKPinAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

        if(nil == pin)
        {
            pin = [[[MKPinAnnotationView alloc] initWithAnnotation:csAnnotation reuseIdentifier:identifier] autorelease];
        }

        [pin setPinColor:(csAnnotation.annotationType == CSMapAnnotationTypeEnd) ? MKPinAnnotationColorRed : MKPinAnnotationColorGreen];

        annotationView = pin;
        TGLog(@"csPin anno");
    }
    else if(csAnnotation.annotationType == CSMapAnnotationTypeImage)
    {
        NSString* identifier = csAnnotation.reuseIdentifier;

        CSImageAnnotationView* imageAnnotationView = (CSImageAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
        if(nil == imageAnnotationView)
        {
            imageAnnotationView = [[[CSImageAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];   
            imageAnnotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        }
        TGLog(@"CSImage anno");
        annotationView = imageAnnotationView;
    } else if(csAnnotation.annotationType == CSMapAnnotationTypeLabel)
    {
        NSString* identifier = csAnnotation.reuseIdentifier;
        CSLabelAnnotationView* labelAnnotationView = (CSLabelAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
        if(nil == labelAnnotationView)
        {
            labelAnnotationView = [[[CSLabelAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];   
        }
        TGLog(@"CSLabel anno");

    } else {
        TGLog(@"%d", csAnnotation.annotationType);
    }
    [annotationView setEnabled:YES];
    [annotationView setCanShowCallout:YES];
    return annotationView;      
}

任何人都可以帮我吗?或者是否有其他标准方法可以在地图上获取UILabel?

1 个答案:

答案 0 :(得分:1)

找到它。
需要在viewForAnnotation()中添加:

annotationView = labelAnnotationView;