RxMapKit is a RxSwift wrapper for MapKit
// Setup MKMapview from Interface Builder
@IBOutlet weak var mapView: MKMapView!
or
// Setup MKMapview
let mapView = MKMapView(frame: self.view.bounds)
self.view.addSubview(mapView)
// Camera position
mapView.rx.regionDidChange
.subscribe(onNext: { print("Did region change: \($0.region) isAnimated \($0.isAnimated)") })
// Marker tapped
mapView.rx.didTapMarker.asDriver()
.drive(onNext: { print("Did tap marker: \($0)") })
.addDisposableTo(disposeBag)
// Update marker icon
mapView.rx.didSelectAnnotationView
.subscribe(onNext: { view in
print("Did selected: \(view.annotation!.title! ?? "")")
view.image = #imageLiteral(resourceName: "marker_selected")
view.backgroundColor = .purple
})
.disposed(by: disposeBag)
mapView.rx.didDeselectAnnotationView
.subscribe(onNext: { view in
print("Did deselected: \(view.annotation!.title! ?? "")")
view.image = #imageLiteral(resourceName: "marker_normal")
view.backgroundColor = .clear
})
.disposed(by: disposeBag)
// Camera animations
button.rx.tap
.map { MKMapCamera(lookingAtCenter: center, fromDistance: 50000, pitch: 30, heading: 45) }
.bindTo(mapView.rx.cameraToAnimate)
.addDisposableTo(disposeBag)
button.rx.tap
.map { CLLocationCoordinate2D(latitude: 33.3659424, longitude: 126.3476852) }
.bindTo(mapView.rx.centerToAnimate)
.addDisposableTo(disposeBag)
button.rx.tap
.map { [annotation0, annotaion1] }
.bindTo(mapView.rx.annotationsToShowToAnimate)
.addDisposableTo(disposeBag)
// Properties
button.rx.tap
.map { .satellite }
.bindTo(mapView.rx.mapType)
.addDisposableTo(disposeBag)
button.rx.tap
.map { false }
.bindTo(mapView.rx.showsTraffic)
.addDisposableTo(disposeBag)
// func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
mapView.rx.handleViewForAnnotation { (mapView, annotation) in
if let _ = annotation as? MKUserLocation {
return nil
} else {
let view = mapView.dequeueReusableAnnotationView(withIdentifier: "reusableIdentifier") ??
MKAnnotationView(annotation: annotation, reuseIdentifier: "reusableIdentifier")
view.image = #imageLiteral(resourceName: "marker_normal")
view.canShowCallout = true
return view
}
}
// func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
mapView.rx.handleRendererForOverlay { (mapView, overlay) in
if overlay is MKCircle {
let renderer = MKCircleRenderer(overlay: overlay)
renderer.strokeColor = UIColor.green.withAlphaComponent(0.8)
renderer.lineWidth = 4
renderer.fillColor = UIColor.green.withAlphaComponent(0.3)
return renderer
} else {
return MKOverlayRenderer(overlay: overlay)
}
}
pod 'RxMapKit'
github "inkyfox/RxMapKit"
MIT