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()