MKMapView addAnnotation不立即添加注释

时间:2012-11-23 13:27:29

标签: objective-c ios mkmapview mkannotation mkannotationview

我有以下简单的代码:

self.departureAnnotation = [[UserAnnotation alloc] init];
self.departureAnnotation.coordinate = self.map.centerCoordinate;
[self.map addAnnotation:self.departureAnnotation];

[self.map selectAnnotation:self.departureAnnotation animated:YES];

此代码应该做什么(显然)是将注释添加到地图并立即选择它。

尽管如此,运行iOS 5.1.1的非jailbraked iPhone 4S上的代码没有选择注释(标注未显示),但这在iOS 6模拟器中完美运行。

为了解决这个问题,我做了以下几点,基本上将引脚的选择延迟了0.2秒,这是我不喜欢的:

self.departureAnnotation = [[UserAnnotation alloc] init];
self.departureAnnotation.coordinate = self.map.centerCoordinate;
[self.map addAnnotation:self.departureAnnotation];

[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(selectPin:) userInfo:self.departureAnnotation repeats:NO];

- (void)selectPin:(NSTimer *)timer
{
    [self.map selectAnnotation:timer.userInfo animated:YES];

}

为什么会这样?

PS:另外,按照相同的模式,如果我检查[self.map viewForAnnotation: self.departureAnnotation]而不是选择引脚,则视图为零。在那0.2秒延迟之后,没关系。

2 个答案:

答案 0 :(得分:2)

MKMapView可能需要运行循环周期才能完成,然后才能给出注释视图/选择注释。如果是这样,请不要使用计时器,使用...

selectAnnotation:animated:发送到下一个运行循环周期
dispatch_async( dispatch_get_main_queue(), ^{
  [self.map selectAnnotation:self.departureAnnotation animated:YES];
} );

......可能会有所帮助。

此外,文档还指出您需要立即添加注释,因为MKMapView决定哪个注释处于开/关屏幕,因此它会返回视图。

只需我0.02美元......

答案 1 :(得分:0)

可能因为CATransactiondocs)而发生。 CATransaction“收集”您在开始和提交状态之间对CALayers所做的所有更改。有时,可能是因为不正确的编程技术,两种方法都会发生“冲突”,通常是异步时。对我来说,它发生了使用按钮,比如当你激活一个按钮并想要同时停用其他按钮时。我想其他修正可能是在[self.map setNeedsDisplay];之后立即拨打[self.map addAnnotation:self.departureAnnotation];,或者按照相同的方法使用这段代码:

id __weak weakSelf = (id)self; 
[CATransaction setCompletionBlock:^{[weakSelf.map selectAnnotation:weakSelf.departureAnnotation animated:YES];}];