2012-01-27 3 views
3

아래 코드는 사용자의 상태 메시지가 포함 된 레이블의 애니메이션을 보여줍니다. 이벤트가 발생하면 레이블은 프롬프트를 표시하고 애니메이션 애니메이션 블록을 통해 서서히 사라집니다.UIView 애니메이션 블록 취소

- (void)showStatusOnLabelWithString:(NSString *)statusMessage 
{ 
    // [self.view.layer removeAllAnimations]; // not working 
    [labelStatus.layer removeAllAnimations]; // not working, too 

    [labelStatus setText:statusMessage]; 
    [labelStatus setHidden:NO]; 
    [labelStatus setAlpha:1.0]; 

    [UIView animateWithDuration:5.0 animations:^ 
    { 
     [labelStatus setAlpha:0.0]; 

    } completion:^(BOOL finished) 
    { 
     [labelStatus setHidden:YES]; 
     [labelStatus setAlpha:1.0]; 
    }]; 
} 

이 레이블이 다시 애니메이션을 먼저해야 후 다음 5 초에 또 다른 이벤트가, 그래서 내가 [self.view.layer removeAllAnimations]으로 이전 애니메이션을 제거한 경우 (내가 생각 이잖아). 하지만 라벨이 완전히 사라지고 다음 5 초에 라벨이 다시 보이지 않습니다.

내가 (또는 사용자)가 5 초를 기다리면 모든 것이 제대로 작동합니다.

왜 작동하지 않습니까?

종류 안부, $ 시간 @의 rky

답변

6

변경은 레이어의 애니메이션을 제거 할 때

completion:^(BOOL finished) 
{ 
    if (finished) { 
     [labelStatus setHidden:YES]; 
     [labelStatus setAlpha:1.0]; 
    } 
}]; 

이유는이 완료 블록을 도달하고있다,하지만 당신은 중단 때문에 finishedfalse 될 것입니다 그것. 또한 주문은 여기에서 중요합니다. 아마도 removeAllAnimations이 즉시 완료 블록을 호출 할 것으로 예상했지만 showStatusOnLabelWithString: 메서드가 완료된 후에 호출됩니다. 따라서 setHidden:NO 다음에 즉시 setHidden:YES이 호출됩니다.

+0

위대한 작품. 완성 된 변수에 대해 새로운 것을 배웠습니다. ^^ – Sharky

0

당신은 레이블의 레이어 (labelStatus.layer)에서 제거 애니메이션을 시도해 봤어?

completion:^(BOOL finished) 
{ 
    [labelStatus setHidden:YES]; 
    [labelStatus setAlpha:1.0]; 
}]; 

이것 :이

+0

예 동일한 결과를 보았습니다 .- 답변을 추가 할 때 내 질문이 업데이트되었습니다. – Sharky

관련 문제