2012-08-01 3 views
5

removeFromSuperview:이 호출되기 전에 animateWithDuration:animations:completion:을 사용하여 내 사용자 인터페이스의 여러 요소 (약 4 개 요소)를 이동 시켰습니다.조치를 취하기 전에 여러 블록이 실행을 완료했는지 어떻게 알 수 있습니까?

제 질문은 removeFromSuperview:에 전화하기 전에 모든 애니메이션이 완료되었음을 어떻게 알 수 있습니까?

+0

여러 블록을 만드는 대신 애니메이션 섹션에서 한 번에 애니메이션을 적용 할 수 없습니까? –

+0

애니메이션의 지속 시간과 스타일이 다른 경우가 아니라 – Goles

+0

개의 [UIView animateWithDuration 호출의 중첩 그룹에 대해 단일 완성 블록을 호출하는 방법]은 복제 할 수 있습니까?] (http://stackoverflow.com/questions/8421441/how-to-invoke -a-single-completion-for-nested-group-of-uiview-animatewith) –

답변

9

내 자신의 질문에 답변.

// Create dispatch queue & group 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_group_t group = dispatch_group_create(); 

    // Two group enters 
    dispatch_group_enter(group); 
    dispatch_group_enter(group); 

    // (notice the group parameter in dispatch_group_leave) 
    [UIView animateWithDuration:0.3 animations:^{ 
     self.pickerView.frame = CGRectMake(self.pickerView.frame.origin.x 
              , self.view.bounds.size.height + self.pickerView.frame.size.height/2 
              , self.pickerView.frame.size.width 
              , self.pickerView.frame.size.height); 
    } completion:^(BOOL finished){ 
     dispatch_group_leave(group); 
    }]; 


    [UIView animateWithDuration:0.3 animations:^{ 
     self.navigationBar.frame = CGRectMake(self.navigationBar.frame.origin.x 
               , -self.navigationBar.frame.size.height 
               , self.navigationBar.frame.size.width 
               , self.navigationBar.frame.size.height); 
    } completion:^(BOOL finished){ 
     dispatch_group_leave(group); 
    }]; 

    // Finishing callback 
    dispatch_group_notify(group, queue, ^{ 
     [self.view removeFromSuperview]; 
    }); 

    // Release the group 
    dispatch_release(group); 

내가이 다른 사람에 대한 예로서 역할을 할 수 있기를 바랍니다 :

나는 이런 식으로 뭔가를하고 결국.

+2

정답으로 추가하십시오. –

0

디스패치 대기열을 생성하고 수행중인 애니메이션의 수만큼 대기열을 대기시킵니다. 슈퍼 뷰에서 제거를 수행하는 블록을 큐에 추가하십시오. 각 애니메이션의 완료 블록에서 일시 중단 된 큐를 다시 시작합니다. 마지막 하나가 완료되면 대기중인 블록이 실행됩니다.

+0

일부 코드로 자세히 설명해 주시겠습니까? – Goles

1

CATransaction도 사용할 수 있습니다. 포함 된 모든 애니메이션을 잡습니다.

[CATransaction begin]; 
[CATransaction setCompletionBlock:^{ // all animations finished here }]; 
[UIView animateWithDuration... 
[UIView animateWithDuration... 
... 
[CATransaction commit]; 

이렇게하면 애니메이션을 직접 추적 할 필요가 없습니다.

관련 문제