2015-06-17 2 views
5

Я пользуюсь услугами Google maps в iOS (Swift) и Android. В андроиде вид карты имеет метод, называемый animatreCamera, который имеет анимацию, в которой движение имеет эффект «уменьшения масштаба» (если обе камеры имеют одинаковый зум, изображение карты уменьшит первую часть движения а затем увеличьте вторую часть). Я хочу добиться этого эффекта с помощью GMSMapView в iOS, я пробовал использовать следующие методы: animateToCameraPosition, , animateWithCameraUpdate, moveCamera и установить камеру на mapView.camera = GMSCameraPosition(target: location, zoom: 15, bearing: 0, viewingAngle: 0), и ни одна из них не имеет этой анимации. Если возможно, как я могу достичь этой анимации при перемещении камеры?GMSMapView animateToCameraPosition zoom in - уменьшить масштаб анимации

ответ

4

Я думаю, что нет прямого способа архивировать одну и ту же анимацию в SDK Google Maps iOS.

Обойти можно использовать dispatch_after метод IOS, сначала вы можете определить метод, чтобы задержать, сколько секунд вы хотите:

func delay(#seconds: Double, completion:()->()) { 
    let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(NSEC_PER_SEC) * seconds)) 

    dispatch_after(popTime, dispatch_get_main_queue()) { 
     completion() 
    } 
} 

Затем вы можете увеличить вашу камеру, переместить в папку, а затем увеличить масштаб delay метод:

delay(seconds: 0.5) {() ->() in 
    var zoomOut = GMSCameraUpdate.zoomTo(kGMSMinZoomLevel) 
    mapView.animateWithCameraUpdate(zoomOut) 

    delay(seconds: 0.5, {() ->() in 
     var vancouver = CLLocationCoordinate2DMake(49.26,-123.11) 
     var vancouverCam = GMSCameraUpdate.setTarget(vancouver) 
     mapView.animateWithCameraUpdate(vancouverCam) 

     delay(seconds: 0.5, {() ->() in 
      var zoomIn = GMSCameraUpdate.zoomTo(kGMSMaxZoomLevel) 
      mapView.animateWithCameraUpdate(zoomIn) 

     }) 
    }) 
} 

Вы можете использовать собственное значение масштабирования, я использую kGMSMinZoomLevel и kGMSMaxZoomLevel здесь.

0

Swift 4:

func delay(seconds: Double, closure: @escaping() ->()) { 
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { 
     closure() 
    } 
    } 

Затем вызовите его:

delay(seconds: 0.5) {() ->() in 
      let zoomOut = GMSCameraUpdate.zoom(to: 10) 
      self.mapView.animate(with: zoomOut) 

      self.delay(seconds: 0.5, closure: {() ->() in 

      var vancouver = CLLocationCoordinate2DMake(49.26,-123.11) 
      var vancouverCam = GMSCameraUpdate.setTarget(vancouver) 
      self.mapView.animate(toLocation: vancouverCam) 

      self.delay(seconds: 0.5, closure: {() ->() in 
       let zoomIn = GMSCameraUpdate.zoom(to: 15) 
       self.mapView.animate(with: zoomIn) 

       }) 
      }) 
     }