2012-04-04 4 views
3

체인으로 실행해야하는 애니메이션이 여러 개 있습니다. 내가 처리해 온 방식은 completionHandler를 사용하고 다음 애니메이션 블록을 실행하는 것입니다. 이 문제를 해결할 더 깨끗한 방법이 있습니까?iOS - 여러 애니메이션 블록?

[UIView animateWithDuration:1 animations^{ 

     // perform first animation 
    }completion:(BOOL finished){ 

      [UIView animateWithDuration:1 animations^{ 

       // perform second animation 
      }completion:(BOOL finished){ 

     }]; 

}]; 
+0

블록을 사용하면 매우 깨끗한 결과를 얻을 수 있습니다. 참조 : http://xibxor.com/objective-c/uiview-animation-without-nested-hell/ –

답변

10

가 순서대로 시작할 수 있도록 당신은 또한 지그재그 지연으로 animateWithDuration:delay:options:animations:completion:을 사용할 수 있지만, 일반적으로는 완료 블록을 수행하는 것이 가장 좋습니다.

(I 내 머리의 상단이를 입력, 그래서 그것을 컴파일되지 않을 수 있습니다) 단지 블록을 고려,이 몇 가지 있습니다 그것은 코드를 읽기 어렵게 인 경우 :

typedef void (^AnimationBlock)(); 

AnimationBlock firstAnimation = ^{ ... }; 
AnimationBlock secondAnimation = ^{ ... }; 

[UIView animateWithDuration:1 animations:firstAnimation completion:(BOOL finished) { 
    [UIView animateWithDuration:1 animations:secondAnimation];}]; 

당신에게 그러한 블록의 배열을 가져 와서 함께 묶어 놓은 카테고리를 UIView에 만들 수 있습니다.하지만 모든 코너 케이스를 처리해야합니다. 타이밍을 어떻게 정의합니까? 중단 된 애니메이션 등을 어떻게 다룰 것인가? 대부분 위의 방법이 아마도 최선의 방법 일 것입니다.

1

나는 이것에 대해 blog post이라고 썼습니다. 내 접근 방식은 블록 및 기타 애니메이션 속성을 캡슐화하는 애니메이션 개체를 만드는 것입니다. 그런 다음 해당 객체의 배열을 순서대로 실행하는 다른 애니메이션 객체에 전달할 수 있습니다. 이 코드는 GitHub에 있습니다.