2016-07-19 5 views
1

CASpringAnimation을 사용하여 CAShapeLayer 경로 애니메이션을 실험하고 있습니다. 예상되는 결과는 '탄력적 인'역할을하는 모양 사이의 '모핑'입니다.CAShapeLayer 경로 봄 애니메이션이 '오버 슛'하지 않습니다.

다음과 같이 원과 사각형 경로 사이에 기본적인 코드 예제가 있지만 최종 결과는 예상되는 동작 인 마지막 더 큰 정사각형 패스를 '지나치게'지나치지 않는 스프링 애니메이션입니다.

enter image description here

내 코드는 다음과 같습니다

let springAnimation = CASpringAnimation(keyPath: "path") 
springAnimation.damping = 1 
springAnimation.duration = springAnimation.settlingDuration 
springAnimation.fromValue = standardCirclePath().cgPath 
springAnimation.toValue = standardSquarePath().cgPath 

circleLayer.add(springAnimation, forKey: nil) // Where circleLayer (red background) is a sublayer of a basic UIView in the frame (blue background) 

내가 내 경로 from this answer 얻었다.

CAShapeLayer 경로 변환에 대해이를 달성하기위한 CASpringAnimation을 사용할 수 있습니까? 그렇지 않으면 대안은 무엇입니까?

+0

알고있는 한, 'CASpringAnimation'은 경로 애니메이션 오버 슛이나 언더 슛에 사용할 수 없습니다. 이것은 중요한 문제는 아니며 Core Animation은 자동 경로 보간에 대한 정교한 지원을하지 않습니다. 이를 해결하기 위해 애니메이션에서 오버 슛과 언더 슛을 방지하기 위해 경로 키 프레임을 추가해야합니다. – LucasTizma

답변

-1

안녕하세요 귀하의 질문에 일하고 있었다 이것은 내 결과, 지프의 고장 내 GIF 컨버터는 아주 나쁜 계산기

enter image description here

이 코드

class ViewController: UIViewController { 

    @IBOutlet weak var animatableVIew: UIView! 
    var isBall = false 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 
    @IBAction func startAnimation(sender: AnyObject) { 

     isBall = !isBall 

     let springAnimation = CASpringAnimation(keyPath: "cornerRadius") 
     let halfWidth = animatableVIew.frame.width/2 
     let cornerRadius: CGFloat = isBall ? halfWidth : 0 
     springAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
     springAnimation.fromValue = isBall ? 0 : halfWidth ; 
     springAnimation.toValue = cornerRadius; 
     springAnimation.damping = 7 
     springAnimation.duration = springAnimation.settlingDuration 
     animatableVIew.layer.cornerRadius = cornerRadius 

     let springAnimation2 = CAKeyframeAnimation(keyPath: "transform.scale") 
     springAnimation2.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
     springAnimation2.values = [1,0.9,1.4,0.8,1] 
     springAnimation2.keyTimes = [ 0, (1/6.0), (3/6.0), (5/6.0), 1 ]; 
     springAnimation2.duration = springAnimation.settlingDuration * 0.5 

     let groupSpringAnimation = CAAnimationGroup() 
     groupSpringAnimation.animations = [springAnimation,springAnimation2] 
     groupSpringAnimation.duration = springAnimation.settlingDuration 
     groupSpringAnimation.beginTime = 0; 
     animatableVIew.layer.addAnimation(groupSpringAnimation, forKey: "group") 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 
에게입니다 때문입니다

이 도움이 되었기를 바랍니다.

+0

OP는 keyPath "path"에 대해 특별히 'CASpringAnimation'에 대해 질문했습니다. 귀하의 답변에는 "경로"라는 단어도 포함되어 있지 않습니다. – chicobermuda

+0

@chicobermuda이 답변이 필요하십니까? –

+0

그래, 아직도 배회하다. – chicobermuda