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

<i>※本記事は、[一般に公開されている情報](https://developer.apple.com/videos/play/wwdc2017/237/)を元に作成しています。記事中の画像はWWDCのスライドのものを引用させて頂いております</i>


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

## Map Type に .mutedStandard 追加

MKMapType に [mutedStandard]( https://developer.apple.com/documentation/mapkit/mkmaptype/2875426-mutedstandard) が追加されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/123b3f2a-783d-9839-21d0-4f367241d1b5.png)

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

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

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

* MKUserTrackingButton
* MKCompassButton
* MKScaleView


![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/402519fb-2f6d-518c-cdce-ea85442003fe.png)

### MKUserTrackingButton

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

使用例：

```swift
let button = MKUserTrackingButton(mapView: mapView)
self.view.addSubview(button)
```

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

* 参考：[ 【MapKit】ユーザートラッキングモードでユーザの現在値を追いかける](http://qiita.com/koogawa/items/487fdd1139ddf14189d0)

### MKCompassButton

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


使用例：

```swift
let compass = MKCompassButton(mapView: mapView)
compass.compassVisibility = .visible
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: compass)
mapView.showsCompass = false
```

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


![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/f81bc4b3-5fd2-3f24-11ac-06c64e41e4d8.png)

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


### MKScaleView

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

使用例：

```swift
let scale = MKScaleView(mapView: mapView)
scale.legendAlignment = .trailing
view.addSubview(scale)
```

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


![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/46c8a8c0-b250-32d9-111b-8bcfa8ed8d95.png)

* .leading - 0を左起点にする
* .trailing - 0を右起点にする

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


## Marker Annotation View の登場

`MKMarkerAnnotationView` が追加されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/a6416252-1117-adae-e8c4-1b55482b0d1a.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/1b74fb3b-bdc1-d6d5-bca2-5b5eb2e158b0.png)

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/cb69228d-69ff-1cfd-eff2-b1f3c5813ce1.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/8466d9a7-d2b8-e4c5-2983-7d3c19df0075.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/9f2d37eb-2ed0-5afb-3d06-50acdbb8efed.png)

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

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/96d04d60-538a-89c8-d718-24726791e7a2.png)

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

（緑のAnnotationの優先度を「High」に設定した場合）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/70f37468-f716-c5b6-0073-677e67f85355.png)

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


![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/66a28427-f646-f3bc-5dff-54dbd7e17212.png)

* required - 必ず表示
* defaultHigh - 優先度高
* defaultLow - 優先度低

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

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

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/8292/95fbb968-2136-999a-df0f-fe3abf6606c3.gif)

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

すべての clusteringIdentifier に `identifier` を設定した例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/3553f6c3-f878-b4a5-9f44-e11ae6fb5afc.png)





また、衝突判定（円形or矩形）も `collisionMode` で設定できます。

.circle:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/0ad6d1a7-f430-8cf7-380d-8255ce854671.png)

.rectangle
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/4bcc6ca4-2c31-d584-f033-a4207e885223.png)

## 所感

iOS 10 ではあまり動きがなかった MapKit ですが、iOS 11 では嬉しいアップデートが盛り沢山ですね。
iOS 11 がどれくらいのスピードで普及していくかはわかりませんが、ぜひ有効に使っていきたいものです。

## リンク

* [What's New in MapKit \- WWDC 2017 \- Videos \- Apple Developer](https://developer.apple.com/videos/play/wwdc2017/237/)
* [iOS 9で強化されたMapKit \- Qiita](http://qiita.com/koogawa/items/0f689750a3210f4d6ff3)