xyk blog

最近は iOS 開発の記事が多めです。

表示中のマップ(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

関連:

xyk.hatenablog.com