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( docs )が原因で発生する可能性があります。CATransactionbegin と commit の状態の間に CALayers で行ったすべての変更を「収集」します。おそらくプログラミング手法が正しくないために、2 つのメソッドが「競合」することがあります。通常は、それらが非同期の場合です。私にとっては、1 つのボタンをアクティブにして他のボタンを同時に非アクティブにしたい場合など、ボタンを使用して発生しました。
[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 に答える