Подтвердить что ты не робот

Закрытие CATransaction немедленно вызывается

Я пытаюсь выполнить блок завершения после завершения моей CAAnimation. Однако кажется, что анимационный блок вызывается до завершения моей анимации. Анимация все равно происходит правильно.

[CATransaction begin];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction setCompletionBlock:completionBlock];
[CATransaction commit];

DropAndBounceAnimation является CAKeyFrameAnimation на position.y с фиксированной продолжительностью.

4b9b3361

Ответ 1

Я не уверен, что это действительно исправление, но, установив блок завершения до, добавив анимацию для слоя, блок завершения последовательно вызывается в нужное время.

[CATransaction begin];
[CATransaction setCompletionBlock:completionBlock];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction commit];

Ответ 2

Вам нужно установить блок завершения перед добавлением анимации.

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration];

[CATransaction setCompletionBlock:^{
// ... whatever you want to do when the animation is complete
}];

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

[CATransaction commit];

Это должно вызвать блок завершения после завершения этой анимации в представлении.

Ответ 3

Вот версия Swift 3.0.1, Xcode 8:

CATransaction.begin()

CATransaction.setCompletionBlock({
  print("Transaction completed")
})

print("Transaction started")
view.layer.add(dropAndBounceAnimation, forKey: "appearance")

CATransaction.commit()

Ответ 4

Попробуйте запустить анимацию асинхронно:

DispatchQueue.main.async {
    self.startAnimation()
}

потому что это может помешать рисованию вида, если вы сделаете некоторые настройки вида перед вызовом анимации.