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
语句或在调试器中设置断点,以确保您实际上正在执行此代码。
您可能已经知道这一点,但使用您自己的图像将需要您创建MKAnnotationView
s 而不是MKAnnotationPinView
s 的图钉。
【讨论】:
是的,你说得对,它实际上并没有被调用。我可能做错了什么?我在代码中有mapView.delegate = self,我在示例中看到的唯一区别是在dealloc中我有mapView.delegate = nil。但是,如果没有那条线,我会收到错误消息。不应该是导致问题的原因吗? dealloc 行不应相关。向我们展示您分配委托属性的功能,也许我们可以在那里发现一些东西。 我已经修改了我的原始帖子,以包括我如何设置委托。这是在 viewDidLoad 方法中完成的。再次感谢。 出现了覆盖但没有调用 viewForAnnotation 是令人烦恼的。但是,请仔细检查以绝对确定您在 mapView 中有一个非零值(它在 IB 中正确连接)。您也可以尝试在 IB 中而不是在代码中设置委托属性,以确保在地图添加注释并在具有有效委托之前调用 viewForAnnotation 时不存在排序问题。以上是关于iPhone Mapkit 将自定义图像和引脚添加到注释中的主要内容,如果未能解决你的问题,请参考以下文章