iPhone Mapkit 将自定义图像和引脚添加到注释中

Posted

技术标签:

【中文标题】iPhone Mapkit 将自定义图像和引脚添加到注释中【英文标题】:iPhone Mapkit adding custom image and pins to annotations 【发布时间】:2011-01-02 16:53:08 【问题描述】:

我正在尝试将图钉颜色从默认红色更改为自定义图像,但无论我尝试什么都行不通。

我已经从这个网站下载了示例代码:

http://icodeblog.com/2009/12/21/introduction-to-mapkit-in-iphone-os-3-0/

代码自己运行,但是当我将注释类导入代码时,它们不起作用,我不知道为什么。我还尝试了其他网站的许多不同方法,但我什至无法更改图钉颜色。

我的项目有 4 个选项卡,而 MapView 位于其中一个选项卡上。当我选择它时,它会解析一个 JSON 字符串并将单独的注释添加到地图上。我点击图钉时会显示标题和副标题,但无法更改颜色或图像。

这是我添加注释的方式 - MapAnnotation 遵循 MKAnnotation:

MapAnnotation *ann = [[MapAnnotation alloc] initWithCoordinate:newCoord];
    ann.title = [locationDictionary objectForKey:@"name"];
    ann.subtitle = [locationDictionary objectForKey:@"name"];

    [mapView addAnnotation:ann];
    [ann release]

这是我尝试更改颜色的方法 - 我在视图控制器中有 MapView.delegate=self:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
MKPinAnnotationView *pin = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:[annotation title]];

if (pin == nil) 
    pin = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:[annotation title]] autorelease];
else 
    pin.annotation = annotation;


pin.pinColor = MKPinAnnotationColorGreen;
pin.animatesDrop = YES;
pin.canShowCallout = TRUE;
return pin;

我得到了带有标题和副标题的注释,而不是绿色标记。无论我使用颜色还是图像,它们总是红色的。如果有人可以帮助我,那就太好了!

谢谢

编辑:

mapView 委托是在 viewDidLoad 方法中分配的。我还在地图的某个部分添加了叠加层。这工作正常,我也把它拿出来试了一下,以防万一它引起了问题,但它仍然没有解决它。

- (void)viewDidLoad 
[super viewDidLoad];

MKCoordinateRegion cordRgn;

LusuAppAppDelegate *delegate =[[UIApplication sharedApplication]delegate];

if (delegate.CurrentLocation == 0) 
    cordRgn.center.latitude = (CENTRE_OF_POSITION_2_LAT);
    cordRgn.center.longitude = (CENTRE_OF_POSITION_2_LON);
    delegate.CurrentLocation = 1;
else if (delegate.CurrentLocation == 1) 
    cordRgn.center.latitude = (CENTRE_OF_POSITION_1_LAT);
    cordRgn.center.longitude = (CENTRE_OF_POSITION_1_LON);  
    delegate.CurrentLocation = 0;


cordRgn.span.latitudeDelta = 0.009f;
cordRgn.span.longitudeDelta = 0.009f;


self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];

//add overlay
MKRasterOverlay *overlay = [[MKRasterOverlay alloc] init];
[overlay setCoordinate:CLLocationCoordinate2DMake(54.005508, -2.780507)];

MKMapRect mkrect;
MKMapPoint mkpointa, mkpointb;
mkrect.origin = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.016964, -2.794862));
mkpointa = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.016964, 2.000000));
mkpointb = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.001447, 2.013770));
mkrect.size.width = mkpointb.x - mkpointa.x;
mkrect.size.height = mkpointb.y - mkpointa.y;
overlay.boundingMapRect = mkrect;

mapView.delegate = self;

[mapView addOverlay:overlay];
[mapView setRegion:cordRgn animated:NO];
[self.mapView setShowsUserLocation:YES];

[self doAnnotations];

doAnnotations 函数是上面显示的代码,但在循环中。再次感谢您的帮助。

【问题讨论】:

【参考方案1】:

您的代码对我来说看起来不错。我怀疑你的委托分配有错误,mapView:viewForAnimation 实际上没有被调用。没有提供该功能的委托的 MKMapView 可以正常工作,所有注释都带有红色引脚。尝试添加一些NSLog 语句或在调试器中设置断点,以确保您实际上正在执行此代码。

您可能已经知道这一点,但使用您自己的图像将需要您创建MKAnnotationViews 而不是MKAnnotationPinViews 的图钉。

【讨论】:

是的,你说得对,它实际上并没有被调用。我可能做错了什么?我在代码中有mapView.delegate = self,我在示例中看到的唯一区别是在dealloc中我有mapView.delegate = nil。但是,如果没有那条线,我会收到错误消息。不应该是导致问题的原因吗? dealloc 行不应相关。向我们展示您分配委托属性的功能,也许我们可以在那里发现一些东西。 我已经修改了我的原始帖子,以包括我如何设置委托。这是在 viewDidLoad 方法中完成的。再次感谢。 出现了覆盖但没有调用 viewForAnnotation 是令人烦恼的。但是,请仔细检查以绝对确定您在 mapView 中有一个非零值(它在 IB 中正确连接)。您也可以尝试在 IB 中而不是在代码中设置委托属性,以确保在地图添加注释并在具有有效委托之前调用 viewForAnnotation 时不存在排序问题。

以上是关于iPhone Mapkit 将自定义图像和引脚添加到注释中的主要内容,如果未能解决你的问题,请参考以下文章

iOS MapKit更改mapview maptype会导致注释图像更改为pin?

将自定义图像(非 JPEG)保存到 iPhone 照片目录

使用 SwiftUI 将单个引脚添加到 Mapkit

MapKit 通过自定义引脚和标注路由

我们如何在 MapKit 中将标签放在自定义引脚上?

将自定义文本添加到 iPhone sdk 中的 uibutton