2014-07-24 3 views
2

내가 작업중인 앱에서 발견 한 이상한 버그가 있습니다. 나는 세부에 도착하기 전에 I는 내 질문에 명시 것이다UIView 애니메이션 완료 블록이 호출되지 않음

1 - 왜 UIView의 애니메이션 완료 블록이 다음 모달보기 후 호출 될 것이다 - 왜 UIView의 애니메이션 완료 블록은

이 호출 할 수 없습니다 수여됩니까?

나는 뷰 컨트롤러가 나타난 후에 시작하는 일련의 UIView 애니메이션을 가지고 있습니다. 완료 블록이 있습니다. 애니메이션 완성 블록이 호출되는 시간은 대다수입니다. 그러나 종종 앱은 완료 블록이 호출되지 않는 상태가됩니다.

또한 새로운보기 컨트롤러를 현재보기 컨트롤러에서 모달로 제시하면 호출되기 전에 호출되지 않은 애니메이션 완료 블록이 호출됩니다.

일단 앱이이 상태에 있으면 모달보기를 다시 표시 할 때를 제외하고는 애니메이션 완료 블록이 다시 호출되지 않습니다.

내 애니메이션 블록은 기본적으로 이것이다 :

int i = 0; 
for (UIView *view in self.cellImageViews) 
{ 
    [UIView animateWithDuration:CELL_ANIMATION_DISMISS_DURATION 
          delay:(i)*CELL_ANIMATION_STAGGER_INTERVAL 
         options:UIViewAnimationOptionCurveEaseIn 
         animations:^{ 
          view.transform = CGAffineTransformTranslate(view.transform, 0, CELL_ANIMATION_DISMISS_TRANSLATION); 
         } completion:^(BOOL finished) { 
         NSLog(@"Animation Completed: i:%d, finished:%d, count%d",i,finished,[self.oldCellImageViews count]) 
         if(finished && (i == ([self.cellImageViews count]-1))) 
         { 
          NSLog(@"if statement passed"); 
          // My completion block stuff goes here 
         } 
         }    
     ]; 
     i++; 
    } 

답변

1

CALayer 애니메이션하지 을 대기하지만 을 혼합한다. 현재 접근법에서는 하나 이상의 이전 애니메이션이 완료 될 수 없게되기 전에 시작하도록 일부 애니메이션을 예약합니다.

  1. 트리거 (체인) 위의 하나의 완성^블록의 새로운 애니메이션 :

    당신은 절대적으로 당신이 일부 다른 옵션을 가지고, CALayer 애니메이션을 원하는 경우.

  2. 대리자를 사용하고 -animationDidStop:finished:에서 새 애니메이션을 트리거합니다.
  3. 꼬집음으로 UIViewAnimationOptionBeginFromCurrentState으로 빠져 나갈 수 있습니다.

진짜 해결책은 하지 사용 CALayer 애니메이션,하지만 CAAnimation입니다.

+0

다음. 예, 애니메이션은 시차를두고 시작됩니다. 네 번째 애니메이션은 첫 번째 애니메이션이 시작되기 전에 시작됩니다. 왜 이것이 완료 블록이 호출되는 것을 막을 수 있습니까? (그리고 왜 가끔씩 만 사용합니까?) – Darren

+0

@ NJGadhiya의 코멘트를보세요. 여기에있는 키워드는'CALayer' 대'CAAnimation'입니다. 동일한 객체에 대해 다른 'CALayer'변환을 예약하여 주어진 객체에 대한'CALayer' 변환을 방해하고 있습니다. 내가 설명한 방법 중 하나를 사용하고 싶지 않고'CAAnimation'으로 전환하지 않는다면 옵션에'UIViewAnimationOptionBeginFromCurrentState'를 추가하면됩니다. – SwiftArchitect

1

시도 내가 당신의 대답을 이해하지 않다

[UIView animateWithDuration:CELL_ANIMATION_DISMISS_DURATION 
         delay:(i)*CELL_ANIMATION_STAGGER_INTERVAL 
        options:UIViewAnimationOptionCurveEaseIn 
       animations:^{ 
        int i = 0; 

        for (UIView *view in self.cellImageViews) 
        { 
         view.transform = CGAffineTransformTranslate(view.transform, 0, CELL_ANIMATION_DISMISS_TRANSLATION); 
         i++; 
        } 

       } completion:^(BOOL finished) { 
        if(finished) 
        { 
         NSLog(@"if statement passed"); 
         // My completion block stuff goes here 
        } 
       } 
]; 
+0

그런 다음 모든 셀이 순차적으로 시작하는 대신 동시에 애니메이션을 적용합니다. – Darren

+0

그러면 CAAnimation을 사용해야합니다. –

관련 문제