【Swift】RxGoogleMapsでイベントを検知する

apple-swift1

Swift3.0でGoogleMap上でマーカーを設定し、そのイベントをRxGoogleMapsでリッスンしています。

import UIKit
import FirebaseAuth
import FirebaseDatabase
import GoogleMaps
import CoreLocation
import RxSwift
import RxGoogleMaps

class MapViewController: UIViewController {

var root : FIRDatabaseReference!
var markerDictionary = Dictionary<GMSMarker, Gate>()
let disposeBag = DisposeBag()

@IBOutlet weak var mapView: GMSMapView!

override func loadView() {
super.loadView()
FIRAuth.auth()?.signInAnonymously() { (user, error) in
self.root = FIRDatabase.database().reference().child("Gates")
self.readGates()
}
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.initialMapView()

self.mapView.rx.didTapMarker.asDriver()
.drive(onNext: {
let marker : GMSMarker = $0
if let gate = self.markerDictionary[marker] {

if gate.inOutType == GateInOutType.inlet {
gate.inOutType = GateInOutType.outlet
} else {
gate.inOutType = GateInOutType.inlet
}
marker.icon = UIImage(named: (gate.inOutType)!.rawValue)

gate.update(reference: self.root)
}

print("Did tap marker: \($0)")
})
.addDisposableTo(disposeBag)

self.mapView.rx.didEndDraggingMarker.asDriver()
.drive(onNext: {
let marker : GMSMarker = $0
if let gate = self.markerDictionary[marker] {
gate.lat = marker.position.latitude
gate.lng = marker.position.longitude
gate.update(reference: self.root)
}
})
.addDisposableTo(disposeBag)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

private func initialMapView() {
let camera = GMSCameraPosition.camera(withLatitude: 0, longitude: 0, zoom: 15)
self.mapView.camera = camera
self.mapView.mapType = kGMSTypeNormal
self.mapView.accessibilityElementsHidden = false
self.mapView.isMyLocationEnabled = true
self.mapView.settings.compassButton = true
self.mapView.settings.myLocationButton = true
self.mapView.settings.scrollGestures = true
self.mapView.settings.zoomGestures = true
self.mapView.settings.rotateGestures = true
}

private func createMarker (gate: Gate) -> GMSMarker {
let position = CLLocationCoordinate2DMake(gate.lat, gate.lng)
let marker = GMSMarker(position: position)
marker.icon = UIImage(named: (gate.inOutType)!.rawValue)
marker.title = gate.name
marker.isTappable = true
marker.isDraggable = true
return marker

// TODO: 吹き出し?
// marker.snippet = "OPEN"
}

func readGates() {
self.root.observeSingleEvent(of: .value, with: { (snapshot) in
if let childSnapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
for childSnapshot in childSnapshots {
let gate : Gate = Gate()
gate.initialize(snapshot: childSnapshot)
gate.listen(reference: self.root)
let marker = self.createMarker(gate: gate)
marker.map = self.mapView
self.markerDictionary[marker] = gate
}
}
}) { (error) in
print(error.localizedDescription)
}
}
}

【スポンサーサイト】





【参考テキスト】

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中