Skip to content

RxSwiftCommunity/RxGoogleMaps

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

RxGoogleMaps

CircleCI Swift Version License Platform

RxGoogleMaps is a RxSwift wrapper for GoogleMaps.

Example Usages

Setup GoogleMaps

// Setup API Key
GMSServices.provideAPIKey("Your-API-Key")
// Setup GMSMapview from Interface Builder
@IBOutlet weak var mapView: GMSMapView!

or

// Setup GMSMapview
let mapView = GMSMapView(frame: self.view.bounds)
self.view.addSubview(mapView)

Observing properties

// Camera position

mapView.rx.didChange.asDriver()
    .drive(onNext: { print("Did change position: \($0)") })
    .disposed(by: disposeBag)

// Marker tapped

mapView.rx.didTapAt.asDriver()
    .drive(onNext: { print("Did tap at coordinate: \($0)") })
    .disposed(by: disposeBag)

// Location update

mapView.rx.myLocation
    .subscribe(onNext: { location in
        if let l = location {
            print("My location: (\(l.coordinate.latitude), \(l.coordinate.longitude))")
        } else {
            print("My location: nil")
        }
    })
    .disposed(by: disposeBag)

Binding properties

// Properties

button.rx.tap
    .map { false }
    .bind(to: mapView.rx.trafficEnabled.asObserver())
    .disposed(by: disposeBag)

// Camera animations

button.rx.tap
    .map { 14 }
    .bind(to: mapView.rx.zoomToAnimate)
    .disposed(by: disposeBag)

button.rx.tap
    .map { GMSCameraPosition.camera(withLatitude: latitude, longitude: longitude, zoom: 8, bearing: 10, viewingAngle: 30) }
    .bind(to: mapView.rx.cameraToAnimate)
    .disposed(by: disposeBag)

// Selected marker

button.rx.tap
    .map { myMarker }
    .bind(to: mapView.rx.selectedMarker.asObserver())
    .disposed(by: disposeBag)

// GMSMarker or GMSOverlay properties

button.rx.tap
    .map{ 180.0 }
    .bind(to: marker.rx.rotation.asObserver())
    .disposed(by: disposeBag)

button.rx.tap
    .map{ UIColor.red }
    .bind(to: circle.rx.fillColor.asObserver())
    .disposed(by: disposeBag)

Delegates which have a return value

// func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool

mapView.rx.handleTapMarker { false }

// func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView?

mapView.rx.handleMarkerInfoWindow { marker in
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 180, height: 60))
    label.textAlignment = .center
    label.textColor = UIColor.brown
    label.font = UIFont.boldSystemFont(ofSize: 16)
    label.backgroundColor = UIColor.yellow
    label.text = marker.title
    return label
}

Note: More examples can be found at the example project from this repo!.

Installation

CocoaPods

Note: Due to the fact Google Maps is delivered as a static library, you must have CocoaPods 1.4.0 installed to install this library.

  • Add to your Podfile:
pod 'RxGoogleMaps'

Than run pod install, and you should be good to go!

Example Project

  1. Get your own API Key a key at https://developers.google.com/maps/documentation/ios-sdk/
  2. Open the example project and set your API Key in AppDelegate

Requirements

License

MIT