[ios] 애니메이션이 완료된 후 CABasicAnimation이 초기 값으로 재설정

CALayer를 회전시키고 애니메이션이 완료된 후 최종 위치에서 중지하려고합니다.

그러나 애니메이션이 완료되면 초기 위치로 재설정됩니다.

(xcode 문서는 애니메이션이 속성 값을 업데이트하지 않는다고 명시 적으로 말합니다.)

이것을 달성하는 방법에 대한 제안.



답변

여기에 답이 있습니다. 제 답변과 Krishnan의 조합입니다.

cabasicanimation.fillMode = kCAFillModeForwards;
cabasicanimation.removedOnCompletion = NO;

기본값은 kCAFillModeRemoved입니다. 보고있는 재설정 동작은 무엇입니까?


답변

removedOnCompletion의 문제점은 UI 요소가 사용자 상호 작용을 허용하지 않는다는 것입니다.

기술은 애니메이션의 FROM 값과 객체의 TO 값을 설정하는 것입니다. 애니메이션은 시작하기 전에 TO 값을 자동으로 채우며, 제거하면 오브젝트가 올바른 상태로 유지됩니다.

// fade in
CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath: @"opacity"];
alphaAnimation.fillMode = kCAFillModeForwards;

alphaAnimation.fromValue = NUM_FLOAT(0);
self.view.layer.opacity = 1;

[self.view.layer addAnimation: alphaAnimation forKey: @"fade"];


답변

다음 속성을 설정하십시오.

animationObject.removedOnCompletion = NO;


답변

그냥 코드 안에 넣으십시오

CAAnimationGroup *theGroup = [CAAnimationGroup animation];

theGroup.fillMode = kCAFillModeForwards;

theGroup.removedOnCompletion = NO;


답변

당신은 단순히의 주요 설정할 수 있습니다 CABasicAnimationposition당신이 레이어에 추가 할 때입니다. 이렇게하면 실행 루프의 현재 패스 위치에서 수행 된 암시 적 애니메이션이 재정의됩니다.

CGFloat yOffset = 30;
CGPoint endPosition = CGPointMake(someLayer.position.x,someLayer.position.y + yOffset);

someLayer.position = endPosition; // Implicit animation for position

CABasicAnimation * animation =[CABasicAnimation animationWithKeyPath:@"position.y"]; 

animation.fromValue = @(someLayer.position.y);
animation.toValue = @(someLayer.position.y + yOffset);

[someLayer addAnimation:animation forKey:@"position"]; // The explicit animation 'animation' override implicit animation

2011 Apple WWDC 비디오 세션 421-Core Animation Essentials (비디오 중간)에 대한 자세한 정보를 얻을 수 있습니다.


답변

CALayer에는 모델 계층과 프레젠테이션 계층이 있습니다. 애니메이션 중 프레젠테이션 레이어는 모델과 독립적으로 업데이트됩니다. 애니메이션이 완료되면 프리젠 테이션 레이어가 모델의 값으로 업데이트됩니다. 애니메이션이 끝난 후 삐걱 거리는 점프를 피하려면 중요한 것은 두 레이어의 동기화를 유지하는 것입니다.

최종 값을 알고 있다면 모델을 직접 설정할 수 있습니다.

self.view.layer.opacity = 1;

그러나 끝 위치를 모르는 애니메이션이있는 경우 (예 : 사용자가 일시 정지 한 후 반전 할 수있는 느린 페이드) 프레젠테이션 레이어를 직접 쿼리하여 현재 값을 찾은 다음 모델을 업데이트 할 수 있습니다.

NSNumber *opacity = [self.layer.presentationLayer valueForKeyPath:@"opacity"];
[self.layer setValue:opacity forKeyPath:@"opacity"];

프리젠 테이션 레이어에서 값을 가져 오는 것도 스케일링 또는 회전 키 패스에 특히 유용합니다. (예를 들어 transform.scale, transform.rotation)


답변

사용하지 않고 removedOnCompletion

이 기술을 시도해 볼 수 있습니다.

self.animateOnX(item: shapeLayer)

func animateOnX(item:CAShapeLayer)
{
    let endPostion = CGPoint(x: 200, y: 0)
    let pathAnimation = CABasicAnimation(keyPath: "position")
    //
    pathAnimation.duration = 20
    pathAnimation.fromValue = CGPoint(x: 0, y: 0)//comment this line and notice the difference
    pathAnimation.toValue =  endPostion
    pathAnimation.fillMode = kCAFillModeBoth

    item.position = endPostion//prevent the CABasicAnimation from resetting item's position when the animation finishes

    item.add(pathAnimation, forKey: nil)
}