2011-04-14 3 views
2

내 사용자 지정 컨트롤에 animated 플래그가있는 -setValue : animated : 메서드가 있습니다.블록 기반 UIView 애니메이션을 "선택"하는 방법은 무엇입니까?

아이폰 OS 4 전에, 나는 이렇게 애니메이션을 쓴 것 :

[UIView animateWithDuration:(animated ? 5.0 : 0.0) animations:^{ 
    // ... layout views ... 
}]; 

:하지만이 리드 애니메이션없는 몇 가지 요소에

if (animated) { 
    [UIView beginAnimations:@"Foo"]; 
    [UIView setAnimationDuration:5.0]; 
} 
// ... layout views ... 
if (animated) { 
    [UIView commitAnimations]; 
} 

지금 내가 쓴!

이 메서드를 한 번 이상 (애니메이션을 처음 사용하지 않고 두 번째) 호출하므로 애니메이션을 두 번째로 지운 시간이 취소되어 새 프레임이 애니메이션없이 "하드"로 설정됩니다.

블록 접근 방식으로 선택적 애니메이션을 구현하는 방법은 무엇입니까?

답변

9

블록에서 변경하려는 모든 변경 사항을 정의 할 수 있습니다. 변경 사항을 애니메이션으로 적용하려면 블록을 UIView animate...으로 보내거나 직접 실행하여 애니메이션없이 변경하십시오.

void (^myViewChanges)(void) = ^() { 
    myView.alpha = 0.5; 
    // other changes you want to make to animatable properties 
}; 

if (animated) { 
    [UIView animateWithDuration:5.0f animations:myViewChanges]; 
} else { 
    myViewChanges(); 
} 
+1

D 'oh, 너무 간단! :-) 감사! –

+0

좋은데 ... 왜 애니메이션은 0의 애니메이션 기간을 지나칠 때 애플이하지 않습니까? (나는 알고있다. 아마 여기 아무도 대답 할 수 없을 것이다. 단지 벤트 (venting).) –

+0

@GregMaletic sort of. 그러나 애니메이션 블록이 실행될 때 시스템이 처리하므로 항상 원하는 결과를 얻지 못할 수 있습니다. AnimateWithDuration : animation : completion : 너무 늦게 완성 블록을 호출하는 경우를 보았습니다. 완료 블록을 저장하고 else 절에서 호출하면 (위와 같이) 나를 위해 그것을 고쳤다. –

관련 문제