2014-09-15 2 views
1

는이 코드가 있습니다필요한 경우 UIView 애니메이션을 중지하는 방법은 무엇입니까?

-(void)animationLoop{ 
CGPoint oldPoint = CGPointMake(myCircleUIView.frame.origin.x, myCircleUIView.frame.origin.y); 
[UIView animateWithDuration:1.0 
       animations: ^{ myCircleUIView.frame = CGRectMake(myCircleUIView.frame.origin.x + [self randomFloatingGenerator], myCircleUIView.frame.origin.y + [self randomFloatingGenerator], myCircleUIView.frame.size.width, myCircleUIView.frame.size.height); } 
       completion: 
^(BOOL finished) { 
    [UIView animateWithDuration:1.0 
         animations:^{ myCircleUIView.frame = CGRectMake(oldPoint.x, oldPoint.y, myCircleUIView.frame.size.width, myCircleUIView.frame.size.height);} 
         completion: 
     ^(BOOL finished) {[self animationLoop];}]; 
}]; 
} 

을하지만, 어떤 제안을 내가와 상호 작용 애니메이션을 중지하려고하지만, [myCircleUIView.layer removeAllAnimations];이 일을하지 않습니다?

답변

2

CALayer's-removeAllAnimations으로 애니메이션을 중지 할 때 finished == NO으로 완료 콜백이 호출됩니다. 그래서 다음과 같이 애니메이션 코드를 변경 :

- (void)animationLoop { 
    __weak id weakSelf = self; 
    CGPoint oldPoint = CGPointMake(myCircleUIView.frame.origin.x, myCircleUIView.frame.origin.y); 
    [UIView animateWithDuration:1.0 
        animations:^{ 
         myCircleUIView.frame = CGRectMake(myCircleUIView.frame.origin.x + [weakSelf randomFloatingGenerator], myCircleUIView.frame.origin.y + [weakSelf randomFloatingGenerator], myCircleUIView.frame.size.width, myCircleUIView.frame.size.height); 
        } 
        completion:^(BOOL finished) { 
         if (!finished) return; 
         [UIView animateWithDuration:1.0 
              animations:^{ 
               myCircleUIView.frame = CGRectMake(oldPoint.x, oldPoint.y, myCircleUIView.frame.size.width, myCircleUIView.frame.size.height); 
              } 
              completion:^(BOOL finished) { 
               if (!finished) return; 
               [weakSelf animationLoop]; 
              }]; 
        }]; 
} 

나는 또한 때문에 가능한 retain cycle의 원하는 당신이하지 당신이 정말로 그렇게하지 않으면 힙 복사 블록 self에 강한 참조를 전달하는 것이 좋습니다.

+0

애니메이션을 중지하려면

IsAnimationContinue=False 

을 설정! – Shamy

+0

애니메이션 블록에서 셀프 사용주기가 유지됩니까? 동일한 클래스에서 참조 된 큐가 강한 블록과 함께 self를 사용하면 사이클이라는 것을 알고 있습니다. 그러나 UIView의 애니메이션 메서드가 클래스 수준 메서드 인 경우 해당 참조주기가 없어야합니다. (나는 그것이 나의 이해에 도전하기 때문에 묻는다. 내가 당신을 반증하려고 노력하고 있기 때문에). – Freddy

+0

좋은 질문인데, 그 이유는 알지 못했지만 모두들 생각했기 때문에 나는 묻지 않았다. : – Shamy

0
아래 코드에서 쇼와 같은 애니메이션을 중지해야 할 때 루프에서 부울을 추가하고 false로 설정

...

BOOL IsAnimationContinue=true; 

-(void)animationLoop{ 
CGPoint oldPoint = CGPointMake(myCircleUIView.frame.origin.x, myCircleUIView.frame.origin.y); 
[UIView animateWithDuration:1.0 
      animations: ^{ 
           if(IsAnimationContinue) 
           { 
           myCircleUIView.frame = CGRectMake(myCircleUIView.frame.origin.x + [self randomFloatingGenerator], myCircleUIView.frame.origin.y + [self randomFloatingGenerator], myCircleUIView.frame.size.width, myCircleUIView.frame.size.height); 
           }} 
      completion:^(BOOL finished) { 
[UIView animateWithDuration:1.0 
        animations:^{ 
           if(IsAnimationContinue) 
           { 
           myCircleUIView.frame = CGRectMake(oldPoint.x, oldPoint.y, myCircleUIView.frame.size.width, myCircleUIView.frame.size.height); 
           }} 
        completion: 
    ^(BOOL finished) {[self animationLoop];}]; 

}]; }

그냥이, ​​완벽 그 것이다

관련 문제