Objective-Cを使用しているプロジェクトでXcodeのバージョンを上げたら下記のような警告がでませんでしたか?
'initWithOverlay:' is deprecated: first deprecated in iOS 7.0
このdeprecatedはMKOverlayView
を継承いているMKPolygonView
やMKCircleView
のイニシャライザが対象になっていると思います。
おそらくMKMapViewDelegate
プロトコルのmapView:viewForOverlay:
またはmapView:didAddOverlayViews:
メソッドで出ていると思います。では前者を例にしてみましょう。
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
if ([overlay isKindOfClass:[MKPolyline class]]) {
MKPolylineView *view = [[MKPolylineView alloc] initWithOverlay:overlay]; // Warning!
view.strokeColor = [UIColor redColor];
return view;
} else if ([overlay isKindOfClass:[MKPolygon class]]) {
MKPolygonView *view = [[MKPolygonView alloc] initWithOverlay:overlay]; // Warning!
view.fillColor = [UIColor blueColor];
return view;
}
return nil;
}
MKMapViewDelegate Protocol Reference
Deprecation Statement
Implement the mapView:rendererForOverlay: method instead.
上記のApple公式リファレンスの通りmapView:rendererForOverlay:
またはmapView:didAddOverlayRenderers:
メソッドに置き換えましょう。こっちはSwiftで書きましょう。
func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
if overlay is MKPolyline {
let render = MKPolylineRenderer(overlay: overlay)
render.strokeColor = UIColor.redColor()
return render
} else if overlay is MKPolygon {
let render = MKPolygonRenderer(overlay: overlay)
render.fillColor = UIColor.blueColor()
return render
}
return nil
}
mapView:viewForOverlay:
ではView(UIView
)そのものを返しているのに対し、mapView:rendererForOverlay:
は描画するためのレンダラー(NSObject
)を返しています。
パッと見何が変わったのかもわからないくらいの変化ですね。なぜこのような変更があったのか、おそらくMKOverlay
を継承させたCustomOverlayを使えるようにするためだと思います。