2013-11-14 3 views
34

CAAnimation이 완료된 후 완료 블록을 실행하려고합니다. 그러나 애니메이션이 완료되기 전에 애니메이션 블록이 호출 된 것 같습니다. 애니메이션은 여전히 ​​올바르게 발생합니다.CATransaction 완료가 즉시 호출됩니다.

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

dropAndBounceAnimation은 고정 된 지속 시간을 사용하여 position.y의 CAKeyFrameAnimation입니다.

답변

81

이 픽스가 실제로 정확한지 확실하지 않지만 완료 블록을 으로 설정하고 레이어에 애니메이션을 추가하기 전에 완료 블록이 올바른 시간에 일관되게 호출됩니다.

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

예는 [문서]에 따라, 인 (https://developer.apple.com/library/ Mac/DOCUMENTATION/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html # // apple_ref/occ/clm/CATransaction/setCompletionBlock :) : "주 스레드에서 즉시 호출되도록 보장되는 완료 블록 객체 이 트랜잭션 그룹에 의해 이후 추가 된 모든 애니메이션 *이 완료되었습니다 (또는 제거되었습니다). " 핵심 부분은 "이후에 추가됨"입니다. – albertamg

+2

@albertamg 그러나 현재 트랜잭션 그룹이 커밋되기 전에 애니메이션이 추가되지 않으면 (또는 완료 블록이 다른 값으로 설정되면) 블록이 즉시 호출됩니다. ' – iwasrobbed

+1

@iWasRobbed yes, 애니메이션을 트랜잭션 그룹에 추가 한 후에 애니메이션이 완료되기 전에 블록이 호출되는 이유는 무엇입니까? – albertamg

10

애니메이션을 추가하기 전에 애니메이션 블록을 설정해야합니다.

[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]; 

이것은 뷰에서 해당 애니메이션이 완료된 후 완료 블록을 트리거해야합니다. 희망이 도움이됩니다. 엄지)

2

여기서, 엑스 코드 8 스위프트 3.0.1 버전이다 :

CATransaction.begin() 

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

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

CATransaction.commit()