MKMapView:更改引脚图像的问题

时间:2015-04-27 14:33:12

标签: ios mkmapview mkannotationview

我正在尝试将标准图钉更改为我自己的图像,但经过多次尝试后仍然失败。

我尝试过在此论坛中找到的不同代码和指南,但它们似乎都没有效果。我相信我错误地将代码粘贴到我的项目中。有任何想法如何用我自己的图像替换常规引脚?

//的.h

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

@interface MapPin : NSObject <MKAnnotation> {

    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;
}

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;

- (id)initWithLocation:(CLLocationCoordinate2D)coord;

@end

//。米

#import <Foundation/Foundation.h>
#import "MapPin.h"

@implementation MapPin

@synthesize coordinate,title,subtitle;

- (id)initWithLocation:(CLLocationCoordinate2D)coord{

    self = [super init];
    if (self) {
        coordinate = coord;
    }
    return self;
}
@end

// Viewcontroller.h

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

@interface FirstViewController : UIViewController <UIAlertViewDelegate, UIWebViewDelegate> {

    MKMapView *mapview;

}
- (IBAction)information;
@property (strong, nonatomic) IBOutlet UIScrollView *ScrollView;
@property (strong, nonatomic) IBOutlet UIImageView *image;
@property (retain, nonatomic) IBOutlet MKMapView *mapview;

- (IBAction)showMenu;
- (IBAction)setMap:(id)sender;
- (IBAction)GetLocation:(id)sender;

@end

// Viewcontroller.m

#import "FirstViewController.h"
#import "MapPin.h"

@implementation FirstViewController

@synthesize ScrollView, image;
@synthesize mapview;

- (void)viewDidLoad{

    MKCoordinateRegion region = { {0.0, 0.0}, {0.0,0.0}};
    region.center.latitude = 55.709900;
    region.center.longitude = 13.201207;
    region.span.longitudeDelta = 0.032f;
    region.span.latitudeDelta = 0.032f;
    [mapview setRegion:region animated:YES];

    MapPin *ann = [[MapPin alloc] init];
    ann.title = @"test Town";
    ann.subtitle = @"test Nation";
    ann.coordinate = region.center;
    ann.coordinate = region.center;
    [mapview addAnnotation:ann];

    MKCoordinateRegion region2 = { {0.0, 0.0}, {0.0,0.0}};
    region2.center.latitude = 55.703904;
    region2.center.longitude = 13.201207;
    region2.span.longitudeDelta = 0.032f;
    region2.span.latitudeDelta = 0.032f;
    [mapview setRegion:region2 animated:YES];

    MapPin *ann2 = [[MapPin alloc] init];
    ann2.title = @"test Town";
    ann2.subtitle = @"test Nation";
    ann2.coordinate = region2.center;
    ann2.coordinate = region2.center;
    [mapview addAnnotation:ann2];

    ScrollView.scrollEnabled = YES;
    [ScrollView setContentSize:CGSizeMake(320, 515)];   
}

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

    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc]
                                    initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
    pinView.animatesDrop=YES;
    pinView.canShowCallout=YES;
    pinView.pinColor= MKPinAnnotationColorGreen;

    pinView.enabled = YES;
    pinView.canShowCallout = YES;
    pinView.image=[UIImage imageNamed:@"test.png"]; //here I am giving the image


    return pinView;
}

3 个答案:

答案 0 :(得分:0)

请参阅我的其他工作实施答案。

设置IBOutlet委托:

由于你正在为你的MKMapView使用IBOutlet,你应该控制 - 从你的storyboard / xib文件中的MKMapView拖动到ViewController /“文件的所有者”,并从弹出窗口中选择“委托”。

这里有一个SO答案,涵盖了创建自定义引脚:Custom pins

此外,

pinView.image=[UIImage imageNamed:@"test.png"]; 

应该是

pinView.image=[UIImage imageNamed:@"test"];

参考:Image from imageNamed:

答案 1 :(得分:0)

以下对我有用:

  1. 确保已将MapKit.framework添加到您的项目中。
  2. 确保test.png在您的项目中(最好在Images.xcassets中)
  3. 控制 - 从故事板中的mapView拖动到ViewController并连接&#34;委托&#34;。
  4. 则...

    #import "MapPin.h"
    #import <MapKit/MapKit.h>
    
    @interface ViewController () <MKMapViewDelegate>
    
    @property (weak, nonatomic) IBOutlet MKMapView *mapview;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        MKCoordinateRegion region = { {0.0, 0.0}, {0.0,0.0}};
        region.center.latitude = 55.709900;
        region.center.longitude = 13.201207;
        region.span.longitudeDelta = 0.032f;
        region.span.latitudeDelta = 0.032f;
        [self.mapview setRegion:region animated:YES];
    
        MapPin *ann = [[MapPin alloc] init];
        ann.title = @"test Town";
        ann.subtitle = @"test Nation";
        ann.coordinate = region.center;
        ann.coordinate = region.center;
        [self.mapview addAnnotation:ann];
    
        MKCoordinateRegion region2 = { {0.0, 0.0}, {0.0,0.0}};
        region2.center.latitude = 55.703904;
        region2.center.longitude = 13.201207;
        region2.span.longitudeDelta = 0.032f;
        region2.span.latitudeDelta = 0.032f;
        [self.mapview setRegion:region2 animated:YES];
    
        MapPin *ann2 = [[MapPin alloc] init];
        ann2.title = @"test Town";
        ann2.subtitle = @"test Nation";
        ann2.coordinate = region2.center;
        ann2.coordinate = region2.center;
        [self.mapview addAnnotation:ann2];
    }
    
    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[MKUserLocation class]]) {
            return nil;
        }
    
        static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
        MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
        if(annotationView) {
            return annotationView;
        } else {
            MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                             reuseIdentifier:AnnotationIdentifier];
            annotationView.image = [UIImage imageNamed:@"test"];
            return annotationView;
        }
    }
    @end
    

答案 2 :(得分:0)

所以我遵循了上面的指导原则,添加了代码行和step3。控制 - 从故事板中的mapView拖动到ViewController并连接“委托”。我把它命名为“pin”。

但是我的图片不会出现......我会再次粘贴新代码......其中一定有问题。

<强> // Viewcontroller.h

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

@interface FirstViewController : UIViewController <UIAlertViewDelegate, UIWebViewDelegate, MKMapViewDelegate> {

    MKMapView *mapview;

}
- (IBAction)information;
@property (strong, nonatomic) IBOutlet UIScrollView *ScrollView;
@property (strong, nonatomic) IBOutlet UIImageView *image;
@property (retain, nonatomic) IBOutlet MKMapView *mapview;
@property (strong, nonatomic) IBOutlet MKMapView *pin;  

- (IBAction)showMenu;
- (IBAction)setMap:(id)sender;
- (IBAction)GetLocation:(id)sender;

@end

<强> // Viewcontroller.m

#import "FirstViewController.h"
#import "MapPin.h"

@implementation FirstViewController

@synthesize ScrollView, image;
@synthesize mapview;
@synthesize pin;

- (void)viewDidLoad{

    MKCoordinateRegion region = { {0.0, 0.0}, {0.0,0.0}};
    region.center.latitude = 55.709900;
    region.center.longitude = 13.201207;
    region.span.longitudeDelta = 0.032f;
    region.span.latitudeDelta = 0.032f;
    [self.mapview setRegion:region animated:YES];

    MapPin *ann = [[MapPin alloc] init];
    ann.title = @"test Town";
    ann.subtitle = @"test Nation";
    ann.coordinate = region.center;
    ann.coordinate = region.center;
    [self.mapview addAnnotation:ann];

    MKCoordinateRegion region2 = { {0.0, 0.0}, {0.0,0.0}};
    region2.center.latitude = 55.703904;
    region2.center.longitude = 13.201207;
    region2.span.longitudeDelta = 0.032f;
    region2.span.latitudeDelta = 0.032f;
    [self.mapview setRegion:region2 animated:YES];

    MapPin *ann2 = [[MapPin alloc] init];
    ann2.title = @"test Town";
    ann2.subtitle = @"test Nation";
    ann2.coordinate = region2.center;
    ann2.coordinate = region2.center;
    [self.mapview addAnnotation:ann2];

    ScrollView.scrollEnabled = YES;
    [ScrollView setContentSize:CGSizeMake(320, 515)];   
}

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

static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKAnnotationView *annotationView = [mapView  dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
if(annotationView) {
    return annotationView;
} else {
    MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                    reuseIdentifier:AnnotationIdentifier];
    annotationView.image = [UIImage imageNamed:@"test"];
    return annotationView;
}
}

@end