更新MKMapView上自定义注释的标题/副标题

时间:2010-07-23 08:33:18

标签: iphone ios4 mkmapview

我创建了一个自定义注释来显示我的数据。数据来自移动车辆,我必须更新他们在地图上的位置以及他们的标题(它显示最后更新时间)。

我的第一种方法是简单地删除所有注释并重新创建它们。然而,这会导致很多可怕的闪烁(地图清除,然后所有注释再次出现)和地图会在重绘时阻塞。不是最佳解决方案。

在OS4 SDK中,他们改进了MKMapViewAnnotation,我现在可以设置坐标(它们之前是只读的)。更改坐标可以很好地移动视图,而不会出现任何闪烁。这解决了我的一个问题。

在API文档中说,更改MKAnnotation的标题会更新MKAnnotationView。确实是MKPinView的情况。如果我更新MKAnnotation的坐标和标题,则引脚会移动并显示新数据。

如何使用自定义MKAnnotationView获得相同的结果?我看不出任何方式要求视图刷新。 我尝试在setNeedsLayout上调用MKAnnotationView,但这只会导致视图消失。

干杯。

2 个答案:

答案 0 :(得分:3)

MKMapView使用KVO观察对titlesubtitle属性的更改。确保地图视图注意到您的更改的最简单方法是使其成为属性并使用setTitle: / setSubtitle:方法(或self.title = @"..."; - 请注意self.表示法是所需的):

CustomAnnotation.h

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

- (void)changeAnnotation;

CustomAnnotation.m

@synthesize title, subtitle;

- (void)changeAnnotation {
    self.title = @"New title!";
    [self setSubtitle:@"New subtitle!"];
}

合成属性设置器为您处理键值观察的严格性。否则,您必须自己致电willChangeValueForKey: and didChangeValueForKey:;这些是在NSObject

中实现的
[self willChangeValueForKey:@"title"];
[title release];
title = @"New title.";
[self didChangeValueForKey:@"title"];

答案 1 :(得分:0)

尝试setNeedsDisplay