2018年2月11日日曜日

MKMapViewで全てのピンを表示する



こんな感じで検索結果をマップ上に表示したい。

全てのピンを表示する一番簡単な方法は、iOS7で追加された MKMapViewの showAnnotations メソッドを使うこと。

ただ、

画面下のMapの上に乗っているView部分は、対象外としてパディングして欲しい

...ので、MKMapViewの setVisibleMapRect で edgePadding を使うかなーと、MKMapRect に変換し、MKMapPointForCoordinate(座標からMapPointを算出) や MKCoordinateRegionMakeWithDistance (距離からRegionを算出)などを使ってチマチマ計算していたのですが、結論をいうと、そんなことしなくてもイケた。

MKMapViewの layoutMargins を設定すればOK!
(iOS11からはdirectionalLayoutMargins)

Marginを設定すれば、 showAnnotations だけでなく、setRegion や setCenter でマップの中心位置を指定する際にもちゃんと合った動きをしてくれます。

Margin が使えるとなれば、showAnnotations を使わずとも、自分で最大最小の緯度経度を出して制御するのも結構簡単。ググればいっぱい引っかかります。
ズームスパンを自分で決めたり、必要な時だけズームを反応させたりとか できちゃいます。

Margin って UIView にある共通のメソッドなので、そんな動きをしてくれるとは思ってなかったなーっ

ちなみに気づいたきっかけは、MKMapViewがSafeAreaのサイズは考慮されている動きをもともとしていたから、あれ、そんならMargin 反応するのか? と思った次第。

layoutMargins を使う話はあまり露出なさげだったので、書いてみました。


• • •