iOS
WWDC

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 がどれくらいのスピードで普及していくかはわかりませんが、ぜひ有効に使っていきたいものです。

リンク