UIView 블록 기반 애니메이션을 취소하는 방법은 무엇입니까?


86

나는 많은 물건과 Apple의 참고 문헌을 검색했지만 여전히 내 문제를 관리 할 수 ​​없습니다.

내가 가진 것 :

  1. 2 UIImageView초와 2 UIButton초가 연결된 화면
  2. 2 가지 애니메이션 :
    1. 한 번만 각 이미지를 차례로 확장 및 축소 viewDidLoad
    2. 버튼을 누르면 (각각의 '내부'에 숨겨진 사용자 정의 버튼 UIImageView) 둘 다가 UIImageView아닌 적절한 애니메이션이 트리거됩니다 (확장, 축소).
    3. iOS4 + 용으로 글을 쓸 때 블록 기반 애니메이션을 사용하라는 지시를 받았습니다!

내가 필요한 것:

실행중인 애니메이션을 취소하려면 어떻게합니까? 나는 마지막 하나를 제외하고 결국 취소했습니다 ... : /

내 코드 스 니펫은 다음과 같습니다.

[UIImageView animateWithDuration:2.0 
                               delay:0.1 
                             options:UIViewAnimationOptionAllowUserInteraction 
                          animations:^{
        isAnimating = YES;
        self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
    } completion:^(BOOL finished){
        if(! finished) return;
        [UIImageView animateWithDuration:2.0 
                                   delay:0.0 
                                 options:UIViewAnimationOptionAllowUserInteraction 
                              animations:^{
            self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
        } completion:^(BOOL finished){
            if(! finished) return;
            [UIImageView animateWithDuration:2.0 
                                       delay:0.0 
                                     options:UIViewAnimationOptionAllowUserInteraction 
                                  animations:^{
                self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
            } completion:^(BOOL finished){
                if(! finished) return;
                [UIImageView animateWithDuration:2.0 
                                           delay:0.0 
                                         options:UIViewAnimationOptionAllowUserInteraction 
                                      animations:^{
                    self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
                }
                                      completion:^(BOOL finished){
                                          if (!finished) return;
                                          //block letter buttons
                                          [self.bigLetterButton setUserInteractionEnabled:YES];
                                          [self.smallLetterButton setUserInteractionEnabled:YES];
                                          //NSLog(@"vieDidLoad animations finished");
                                      }];
            }];
        }];
    }];

smallLetter UIImageView(버튼을 통해) 눌렀을 때 bigLetter애니메이션이 제대로 취소 되기 때문에 어떻게 든 제대로 작동하지 않습니다 .

편집 : 나는이 솔루션을 사용했지만 여전히 축소에 문제가 있습니다 smallLetter UIImageView-전혀 취소하지 않습니다 ... 솔루션

EDIT2 : 다음 / 이전 방법의 시작 부분에 이것을 추가했습니다.

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

문제가 계속됩니다 ... : / 애니메이션 체인의 문자에 대한 마지막 애니메이션을 중단하는 방법을 모릅니다


안녕 쿤와 르 하리의 대답은 이제 받아 들여 져야한다고 생각합니다.
marczellm

요즘 에는 UIViewPropertyAnimator 를 사용해야합니다 .이 또한 매우 쉽습니다.
Fattie

답변:


151

다음을 호출하여 뷰의 모든 애니메이션을 중지 할 수 있습니다.

[view.layer removeAllAnimations];

(view.layer에서 메소드를 호출하려면 QuartzCore 프레임 워크를 가져와야합니다.)

모든 애니메이션이 아닌 특정 애니메이션을 중지하려는 경우 가장 좋은 방법은 UIView 애니메이션 도우미 메서드보다 명시 적으로 CAAnimations를 사용하는 것입니다. 그러면보다 세분화 된 제어가 가능하고 이름으로 명시 적으로 애니메이션을 중지 할 수 있습니다.

Apple Core Animation 문서는 여기에서 찾을 수 있습니다.

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html


10
내 관찰에 따르면 removeAllAnimations를 호출 한 후 후속 animateWithDuration이 더 이상 작동하지 않습니다. 이것은 페이지 매김을 수행하고 컨트롤을 새로 고치기 위해 당기기위한 것입니다. 아마도 다른 누군가가 다른 것을 관찰 할 수도 있습니다. 결국 CABasicAnimation을 사용하고 [myView.layer removeAnimationForKey : @ "animationKey"]를 호출합니다.
Zhang

@Nick 팁을 주셔서 감사합니다. 링크가 더 이상 지원되지 않는 것
같다는 알림을 받으면

) (view.layer.removeAllAnimations 후 다시 애니메이션보기를 추가 작동하지
Bunthoeun

52

iOS 10의 경우 UIViewPropertyAnimator를 사용하여 애니메이션을 적용합니다. UIView 애니메이션을 시작, 중지 및 일시 중지하는 방법을 제공합니다.

 let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
        self.view.alpha = 0.0
 }
 // Call this to start animation.
 animator.startAnimation()

 // Call this to stop animation.
 animator.stopAnimation(true)

3

나는 removeAllAnimations를 부드럽게 다음 아이디어를 매우 편리하게 만들기 위해 Nick의 대답에 추가 할 것입니다.

[view.layer removeAllAnimations];
[UIView transitionWithView:self.redView
                  duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                      [view.layer displayIfNeeded];
                  } completion:nil];

0

이것을 시도 할 수 있습니다 (Swift에서) :

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

참고 : 필요한 경우 두 호출 사이에 코드를 넣을 수 있습니다. 예를 들면 다음과 같습니다.

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.