2012-04-05 4 views
13

UIView 애니메이션 블록 안에 현재 애니메이션의 지속 시간을 가져 오는 방법이 있습니까?현재 애니메이션 블록의 애니메이션 지속 시간을 확인하십시오.

[UIView animateWithDuration:1.0 animations:^{ 
    // float duration = ? 
}]; 
+0

나는 애니메이션의 길이가 1.0이 아니겠습니까? –

+2

예,하지만 기간을 알아야하는 블록 내부의 구성 요소를 사용하고 있으며 기간을 변수로 전달하지 않으려합니다. – adamsiton

+0

좋은 질문입니다. +1 미안하지만 도움이되지 않습니다. –

답변

0

블록을 사용하고 있으므로 변수를 캡처하지 않는 이유는 무엇입니까?

CGFloat duration = 1.0; 
[UIView animateWithDuration:duration animations:^{ 
    CGFloat theDuration = duration; 
}]; 
+0

동의 함. 우리는 이미 지속 시간을 지났고 그 이유는 우리가 다른 방법을 찾아야하는 이유입니다. – Mrug

2

[CATransaction animationDuration]는 쉽게만큼 현재 애니메이션을 얻을 수 있습니다

+0

불행하게도 작동하지 않습니다. UIView 애니메이션 블록은 분명히 CATransaction에서 직접 작동하지 않습니다. –

2

찾고있는 것입니다. 예를 들어, CATransaction 설정 :

CAAnimation *animation = [self.layer animationForKey:self.layer.animationKeys.firstObject]; 
[CATransaction begin]; 
[CATransaction setAnimationDuration:animation.duration]; 
[CATransaction setAnimationTimingFunction:animation.timingFunction]; 

// CALayer animation here 

[CATransaction commit]; 
2

TL; DR : -animationForKey하지의 CALayer -actionForKey :, 사용

@Dimitri Bouniol의 대답은 나를 위해 작동하지 않았다을 한는에서 호출 할 때 애니메이션 블록 안에 영향을받는 설정자. UIView의 애니메이션 시스템은 실제 애니메이션을 시작하기 전에 상태를 설정하고 (실제 애니메이션을 시작하기 전에 setter를 호출하기 때문에) 이해해야합니다. 레이어에서 비슷한 -actionForKey : 메서드를 호출했지만 나에게 효과적이었습니다. 반환 된 작업에는 적절한 기간이 설정되어 있으며 답변에 그대로 사용할 수 있습니다.

CAAnimation *animation = (CAAnimation*) 
[self.layer [email protected]"position"]; // or property of interest 

[CATransaction begin]; 
[CATransaction setAnimationDuration:animation.duration]; 
[CATransaction setAnimationTimingFunction:animation.timingFunction]; 

// CALayer animation here 

[CATransaction commit]; 
관련 문제