表示中のマップ(MKMapView)領域内に含まれるアノテーション(MKAnnotation)を調べる
検証環境:
Xcode Version 12.5 (12E262)
Swift 5.4
iOS Deployment Target 11.0
表示中のマップ(MKMapView)領域内に配置されているアノテーション(MKAnnotation)を調べる方法について。
MKMapView.visibleMapRect
で現在表示中の領域を取得し、MKMapView.annotations(in:)
に表示領域の mapRect を渡すことで表示領域内にあるアノテーション配列を取得できる。
以下ではそれらを使い Extension として実装した。
extension MKMapView { func visibleAnnotations() -> [MKAnnotation] { return annotations(in: visibleMapRect).compactMap { $0 as? MKAnnotation } } }
自身の現在位置アノテーション(MKUserLocation)は除外する場合
extension MKMapView { func visibleAnnotations() -> [MKAnnotation] { return annotations(in: visibleMapRect).compactMap { $0 as? MKAnnotation }.filter { !($0 is MKUserLocation) } } }
使用例としてスワイプやピンチイン・ピンチアウトでマップを動かし表示表域内にアノテーションが無くなったらアノテーションの再検索を実行させたい場合。
extension ViewController: MKMapViewDelegate { func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { if mapView.visibleAnnotations().isEmpty { // 検索処理を実行 } } }
参考:
visibleMapRect
https://developer.apple.com/documentation/mapkit/mkmapview/1452732-visiblemaprect
annotations(in:)
https://developer.apple.com/documentation/mapkit/mkmapview/1452279-annotations
関連: