Edited at

iOS 11で大幅に強化されたMapKit

More than 1 year has passed since last update.

※本記事は、一般に公開されている情報を元に作成しています。記事中の画像はWWDCのスライドのものを引用させて頂いております

WWDC 2017 で発表された iOS 11 では MapKit も色々と強化されています。以下にその内容をまとめます。


Map Type に .mutedStandard 追加

MKMapType に mutedStandard が追加されました。

image.png

標準のマップアプリで言う「交通機関」のような見た目になるようです。


コンパス、スケールバーなどがコントロール可能に

新たに3つのクラスが追加されました。


  • MKUserTrackingButton

  • MKCompassButton

  • MKScaleView

image.png


MKUserTrackingButton

トラッキングモード(現在値を追従)に切り替えるボタンです。

使用例:

let button = MKUserTrackingButton(mapView: mapView)

self.view.addSubview(button)

iOS 5からあった MKUserTrackingBarButtonItem は UIBarButtonItem ベースであるため、ツールバーの上にしか置けませんでした。一方 MKUserTrackingButton は UIView ベースなので、地図上の好きな場所に設置できます。


MKCompassButton

方位を示すコンパスのボタン。今までコンパスは右上固定でしたが、iOS 11から好きな場所に設置できるようになります。

使用例:

let compass = MKCompassButton(mapView: mapView)

compass.compassVisibility = .visible
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: compass)
mapView.showsCompass = false

compassVisibility プロパティには、次の3つの値をセットすることができます。

image.png


  • .hidden - 常に非表示

  • .visible - 常に表示

  • .adaptive - 地図の方位を動かしたとき(北が上ではない状態)だけ表示。タップすると元の状態に戻り、コンパスは非表示になる


MKScaleView

地図の縮尺を表すスケールバー

使用例:

let scale = MKScaleView(mapView: mapView)

scale.legendAlignment = .trailing
view.addSubview(scale)

legendAlignment プロパティには、次の2つの値をセットすることができます。

image.png


  • .leading - 0を左起点にする

  • .trailing - 0を右起点にする

※ただし、アラビア語の場合は左右が逆になるようです


Marker Annotation View の登場

MKMarkerAnnotationView が追加されました。

image.png

従来の MKPinAnnotationView と比べると、だいぶ大きいですね。

image.png

Title, Subtitle は titleVisibility, subtitleVisibility で「表示/非表示/必要なときだけ表示」を設定できます。

もちろん色指定もできます。(namedでの指定がiOS 11からできるようになりました)

image.png

glyphText プロパティに文字をセットすることで、Annotation の中を自由に書き換えられます。デフォルト(nil)を指定すると、ピンのアイコンになります。

image.png

glyphImage を使えば画像をセットすることもできます。

image.png

WebAPIからPOIの画像を取ってきて Annotation の中に動的にセットする、といったことが簡単にできるようになりますね。


Annotation に優先度を設定できるように

次の図のように、Annotation が密集して見にくい場合があると思います。

image.png

こんなとき、優先度を設定することにより、どの Annotation を優先的に表示するかを設定できるようになりました。

(緑のAnnotationの優先度を「High」に設定した場合)

image.png

優先度は displayPriority で設定できます。

image.png


  • required - 必ず表示

  • defaultHigh - 優先度高

  • defaultLow - 優先度低


Annotation をまとめられるようになった

次の例のように、地図の縮尺に合わせて Annotation をまとめられるようになりました!(個人的に一番嬉しいアップデート)

demo.gif

clusteringIdentifier 単位でひとつにまとめられます。

すべての clusteringIdentifier に identifier を設定した例:

image.png

また、衝突判定(円形or矩形)も collisionMode で設定できます。

.circle:

image.png

.rectangle

image.png


所感

iOS 10 ではあまり動きがなかった MapKit ですが、iOS 11 では嬉しいアップデートが盛り沢山ですね。

iOS 11 がどれくらいのスピードで普及していくかはわかりませんが、ぜひ有効に使っていきたいものです。


リンク