iOS에서 CoreAnimation의 애니메이션 끝 확인(animationDidStop)

1816 단어
Core Animation에서 우리는 CAAnimation 대상의delegate 방법- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag을 통해 애니메이션이 끝난 후의 일부 조작을 완성할 수 있지만 때때로 문제가 발생할 수 있다. 예를 들어 여러 CAAnimation 대상의delegate가 같은 대상이면 어느 CAAnimation 대상인지 구분해야 한다. 우리는 [xxx.layer animationForKey:@"key"]를 통해CAAnimation 대상을 얻고 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 방법 중의 anim와 비교할 수 있다.그러나 때때로 항상 틀리면 다음과 같은 코드를 추가해야 한다
yourAnimtion.removedOnCompletion = NO;

이렇게 하면 [xxx.layer animationForKey:@"key"];를 통해 키에 대응하는 애니메이션을 찾을 수 있고, 다음에 필요한 애니메이션이 끝난 후의 동작을 추가할 수 있다.
  • 위에 주의하는 방법은animationForKey :
  • 위의 문제를 해결했지만 순환 인용 문제가 조용히 발생했을 수도 있다.
    이 애니메이션을 설정한 경우 다음을 수행합니다.
    yourAnimtion.delegate = self;  
    

    애니메이션이 끝난 후에도 제거하지 않도록 하려면 다음과 같이 하십시오.
    yourAnimtion.removedOnCompletion = NO;
    

    그래서......self는 yourView를 가지고 있다-->yourView는 yourView를 가지고 있다.layer --> yourView.layer 보유 your Animtion, your Animtion 또self=> 그럼 왜 your Animtion이 self를 가지고 있을까요?
    왜냐하면
    yourAnimtion.delegate = self;  
    

    너는 틀림없이 delegate가self를 강제로 인용하지 않을 거라고 생각할 것이다. 그러나 틀렸다.아래의 공식 코드를 보십시오
    /* The delegate of the animation. This object is retained for the
     * lifetime of the animation object. Defaults to nil. See below for the
     * supported delegate methods. */
    
    @property(nullable, strong) id  delegate;
    

    위에 쓰는 strong나무가 있는데...
    순환 인용 문제 해결
    애니메이션이 끝나는 delegate 메서드에서 다음을 수행합니다.
    [yourView.layer removeAllAnimations];
    

    또는
    [yourView.layer removeAnimationForKey:yourKey];
    

    좋은 웹페이지 즐겨찾기