IOS GoogleMaps SDK - обработчик анимации animateToCameraPosition завершен?

В настоящее время я использую SDK GoogleMaps для iOS для различных операций. При вызове

[self.googleMapsView animateToCameraPosition:[GMSCameraPosition 
                            cameraWithLatitude:LATITUDE
                                     longitude:LONGITUDE
                                          zoom:ZOOM]];

есть ли обработчик завершения, чтобы определить, закончилась ли анимация или нет?

Конечно, я получаю обновления GMSMapViewDelegate о CameraPosition, но как мне проверить, завершена ли анимация?

- (void)mapView:(GMSMapView *)mapView 
didChangeCameraPosition:(GMSCameraPosition *)position;

Ответ 1

Для ссылок будущих читателей этого сообщения, SDK Google Maps для версии 1.4.0, выпущенный в июле 2013 года, добавил новый метод делегирования mapView: idleAtCameraPosition:, который будет запущен в конце любого движения камеры - будь то программная анимация, как в этом вопросе или пользовательские движения.

Ответ 2

Это может работать (я не пробовал):

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration];
[self.googleMapsView animateToCameraPosition:[GMSCameraPosition 
                        cameraWithLatitude:LATITUDE
                                 longitude:LONGITUDE
                                      zoom:ZOOM]];
[CATransaction setCompletionBlock:^{
    // ... whatever you want to do when the animation is complete
}];
[CATransaction commit];

В принципе, это создает транзакцию анимации, которая оживляет движение вашей камеры (измените значение для numberWithFloat:, чтобы изменить скорость), и вы установите свой собственный блок завершения, указав, что вы хотите сделать, когда анимация окончена. [CATransaction commit] - это то, что отключает анимацию.

Примечание: этот ответ частично основан на этом ответе.

Ответ 3

Я не верю, что есть, однако...

Метод, который хорошо работал у меня до сих пор, заключается в том, чтобы установить таймер для запуска (очень) вскоре после прекращения обновления местоположения:

- (void)mapView:(GMSMapView*)mapView didChangeCameraPosition:(GMSCameraPosition*)position {
  // _panTimer is an instance variable of the delegate.
  [_panTimer invalidate];
  _panTimer = [NSTimer timerWithTimeInterval:0.2
                                      target:self
                                    selector:@selector(_mapHasStoppedMoving)
                                    userInfo:nil
                                     repeats:NO];
  [[NSRunLoop currentRunLoop] addTimer:_panTimer forMode:NSDefaultRunLoopMode];
}

Ответ 4

В последнее время я столкнулся с проблемой методов анимации google, в которых отсутствуют обработчики завершения.
Лучшим решением, которое я нашел до сих пор, является присоединение моего собственного обработчика завершения через API CATransation.

private func attachCompletionHandlerToGoogleAnimations(@noescape animations: () -> Void, #completion: (() -> Void)!) {
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    animations()
    CATransaction.commit()
}

Пример использования:

attachCompletionHandlerToGoogleAnimations({
    googleMapView.animateToLocation(coordinate)
}) {
    println("camera moved to location \(coordinate)")
}

Ответ 5

Пример версии SWIFT:

let vancouver = CLLocationCoordinate2D(latitude: 49.26, longitude: -123.11)
let calgary = CLLocationCoordinate2D(latitude: 51.05,longitude: -114.05)
let bounds = GMSCoordinateBounds(coordinate: vancouver, coordinate: calgary)
let cameraPosition = GMSCameraUpdate.fit(bounds)

CATransaction.begin()
CATransaction.setValue(1.0/*duration in seconds*/, forKey: kCATransactionAnimationDuration)
CATransaction.setCompletionBlock({
    print("animation complete, do whatever you want here")
})
mMapView.animate(with: cameraPosition)
CATransaction.commit()