2012-12-12 5 views
0

이 기본보기 애니메이션을 고려하십시오. 그것은 제 1의 과정을 통해 아래로 아무것도 뷰를 확장 할 수 :재사용 가능한 UIView 애니메이션

[UIView animateWithDuration: 1.0 
         delay: 0.0 
        options: UIViewAnimationCurveEaseIn 
       animations:^{ 
        vw.transform = CGAffineTransformMakeScale(0.0, 0.0); 
       } 
       completion:^(BOOL finished) { 
        if (finished) { 
         vw.transform = CGAffineTransformIdentity; 
        } 
       } 
]; 

는 내가 뭘하려는 내 응용 프로그램을 통해 서로 다른 시간에 많은 다른보기에이 같은 애니메이션을 사용합니다. 이렇게하려면 메서드에 넣고 확대/축소하려는 뷰를 전달하면됩니다. 문제 없어.

상황에 따라 애니메이션 완료시 다른 작업을 수행해야 할 수도 있습니다. 예를 들어 한 경우에 SuperView에서보기를 제거하고 다른 경우에보기를 새 위치로 이동 (나중에 확대) 할 수 있습니다.

간단히 말해서 : 애니메이션이 완료되면 내 메소드의 호출자에게 어떻게 알릴 수 있습니까?

completion:^(BOOL finished) { 
    if (finished) { 
     vw.transform = CGAffineTransformIdentity; 
     // Do something unique here 
    } 
} 

답변

3

당신은뿐만 아니라 완료 블록 자체에 전달할 수 있습니다

- (void)animateView:(UIView *)v completion:(void ^(BOOL))ch 
{ 
    [UIView animateWithDuration: 1.0 
          delay: 0.0 
         options: UIViewAnimationCurveEaseIn 
        animations:^{ 
         v.transform = CGAffineTransformMakeScale(0.0, 0.0); 
        } 
        completion:ch 
    ]; 
} 

그럼 난 블록과 사랑에 빠지게하기 시작하고

[self animateView:someView completion:^(BOOL flag) { 
    // do stuff here 
}]; 
+0

다음과 같이 호출. 멋지고 우아한 솔루션 - 감사합니다! – Axeva

+0

@Axeva 문제 없습니다. 나는 블록도 사랑한다. 내 toolchain이 그들을 지원하지 않는다 (너무 나쁘다. 표준이 아니다.). C/Objective-C에 대한 유일한 유용한 확장 기능입니다. –