2

我有以下简单的代码:

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 的未越狱 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 秒的延迟之后,没关系。

4

2 回答 2

2

MKMapView可能需要完成运行循环周期才能为您提供注释视图/选择注释。如果是这样,请不要使用计时器,将您分派selectAnnotation:animated:到下一个运行循环周期...

dispatch_async( dispatch_get_main_queue(), ^{
  [self.map selectAnnotation:self.departureAnnotation animated:YES];
} );

...可能会有所帮助。

文档还指出您需要立即添加注释,因为MKMapView它决定了哪个注释在屏幕上/不在屏幕上,因此它会为它返回视图。

只是我的 0.02 美元...

于 2012-11-23T14:52:20.960 回答
0

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

id __weak weakSelf = (id)self; 
[CATransaction setCompletionBlock:^{[weakSelf.map selectAnnotation:weakSelf.departureAnnotation animated:YES];}];
于 2012-11-23T14:55:29.847 回答