[iOS][Objective-C] iOS 9 にしたら起こった不具合とその対策 [MKMapView編]

MapKit でアノテーションに画像が適用されない

MKMapView

MapKitMKMapView では、地図の上にアノテーション(ピンなど)を立てることが出来ます。

緯度・経度を指定することで、特定のポイントを指定可能です。

MKMapView の基本的な使い方は、以下の記事が参考になります。

[iOS][小ネタ] 地図アプリ作成時に役に立ちそうな MKMapView の 目的別実装例 | Developers.IO

アノテーションに画像を指定 (iOS 8)

さらに、アノテーションを表示する際、形状をピンから指定した画像に変更できます。

この際、iOS 8 までの端末では、以下の様なコードで画像指定を実現できました。

MKMapViewDelegate プロトコルに準拠している宣言をすると、適切なタイミングで以下のデリゲートメソッドが呼ばれます。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation

この中で、渡ってくる annotationを利用して MKPinAnnotationViewのインスタンスを生成し、image プロパティに UIImage型の画像データを入れることで、画像付きのアノテーションが表示されます。

[mapView dequeueReusableAnnotationViewWithIdentifier:PinIdentifier];
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:PinIdentifier];
annotationView.image = [UIImage imageNamed:@"pinImage"];
annotationView.annotation = annotation;
self.annotationView = annotationView;
return annotationView;

上記を含めたコードを iOS 8.4.1 で実行した所、正常に表示されました。

IMG_6133

アノテーションに画像を指定 (iOS 9)

一方で、上記と同じコードを指定した場合、iOS 9.0.2 の端末では、ピンに画像が表示されません。

IMG_7105

解決法

MKPinAnnotationViewMKAnnotationView に変更すると、正常に表示されます。

上記のコードの以下の部分を変更することで、iOS 9 でも正常に表示されるようになりました。

annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:PinIdentifier];

IMG_7106

まとめ

iOS 9になって、描画周りが変わり、iOS 8までとは違う挙動が起こっているように見受けられます。もし検証ができましたら、追って記事にしたいと思います。

ありがとうございました!