[swift] NSTimerでGoogleMAPを常に現在地を中央にするように追跡

目次

NSTimerでGoogleMAPを常に現在地を中央にするように追跡

サンプルコード

*CLLocationで位置情報取得できるようにしていることが前提

class ViewController: UIViewController,GMSMapViewDelegate {
    
    var googleMap : GMSMapView!
    var latitude: CLLocationDegrees!
    var longitude: CLLocationDegrees!
    var iconImage:UIImage!
    var selfMarker: GMSMarker!
    
    var timer: NSTimer?
    var timerBool:Bool = true

override func viewDidLoad() {
        super.viewDidLoad()

                iconImage = UIImage(named:"icon.png") //自分のアイコンをカスタマイズ
        
        //GoogleMAP
        googleMapInit()
        
        //Timer Start
        startTimer()
        
    }
//MARK: Timer
    // タイマー開始
    func startTimer() {
         timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(ViewController.update(_:)), userInfo: nil, repeats: true)
    }
    
    func update(timer: NSTimer) {
        //GoogleMAPが取得している位置を取得
        if let mylocation = googleMap.myLocation {
            latitude = mylocation.coordinate.latitude
            longitude = mylocation.coordinate.longitude
            
            googleMapSelfRemark(googleMap)
            
            if timerBool {
                //カメラを現在地に
                let update = GMSCameraUpdate.setTarget(mylocation.coordinate)
                googleMap.moveCamera(update) //アニメーションにするとカクカクするのでアニメーションなしのUpdate
            }
        }
    }


    
    //MARK: GoogleMAP Method /////////    
    func googleMapInit(){
        let width = self.view.frame.width
        let height = self.view.frame.height
        
        let camera: GMSCameraPosition = GMSCameraPosition.cameraWithLatitude(latitude,longitude: longitude, zoom: kMapZoom) // カメラを生成
        googleMap = GMSMapView(frame: CGRectMake(0, 0, width, height)) // MapViewを生成.
        googleMap.mapType = kGMSTypeNormal //MAPtype標準
        googleMap.delegate = self
        googleMap.camera = camera // MapViewにカメラを追加.
        googleMap.myLocationEnabled = true //これがないとGoogleMAPで取得した位置が取得できない        
        self.view.addSubview(googleMap)//viewにMapViewを追加.
        
        googleMapSelfMarkerCreate()
    }
    
    //アイコンを再生成
    func googleMapSelfRemark(mapView: GMSMapView){
        selfMarker.map = nil //自身のアイコンを消す
        googleMapSelfMarkerCreate()
    }

    //アイコンを追加
    func googleMapSelfMarkerCreate(){
        selfMarker = GMSMarker()
        selfMarker.position = CLLocationCoordinate2DMake(latitude, longitude)
        selfMarker.icon = iconImage
        selfMarker.map = googleMap
        
    }

    //MAPのどこかをタップした時はその場所にカメラを移動し、追跡をOFFに
    func mapView(mapView: GMSMapView, didTapAtCoordinate coordinate: CLLocationCoordinate2D) {
        timerBool = false //追跡OFF
        googleMap.animateToLocation(coordinate) //カメラを現在地に
    }
    
    //gesture(ピンチやズームなど)があった際は、追跡をOFFに
    func mapView(mapView: GMSMapView, willMove gesture: Bool) {
        if gesture {
            timerBool = false //追跡OFF
        }
    }
}

googleMap.myLocationEnabled = trueにするとGoogleMAPが現在地を表示できるようになるので
googleMap.myLocationでcoordinate情報を取得する
Timerで1秒ごとにカメラをGoogleMAPの現在地に移動させているので常に中央に表示しているように見える

ちなみに何か動作した時にはカメラの追跡をやめさせたかったので、timerBoolで追跡したい・したくないを実装している

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です