2016-09-05 11 views
0

円のアニメーションを消したいと思い、次のコードを実行しました(インターネット上の他のコードに基づいています)。アニメーションが完了したときアニメーションは元の画像を最後に保持します

class CircleView: UIView { 
    private var circleLayer: CAShapeLayer? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     self.commonInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.commonInit() 
    } 

    func commonInit() { 
     self.tintColor = UIColor.lightGrayColor() 
     self.backgroundColor = UIColor.clearColor() 
    } 

    override func drawRect(rect: CGRect) { 
     super.drawRect(rect) 
     self.drawCircle() 
     self.addCircleAnimation() 
    } 

    func drawCircle() { 
     let size:CGFloat = CGFloat(100) 
     self.circleLayer?.removeFromSuperlayer() 
     self.circleLayer = CAShapeLayer() 
     self.circleLayer?.frame = self.bounds 
     let radius = size/2; 
     let path = UIBezierPath(arcCenter: CGPointMake(size/2, size/2), radius: radius, startAngle: -CGFloat(M_PI)/4, endAngle: 2 * CGFloat(M_PI) - CGFloat(M_PI)/4, clockwise: true) 
     self.circleLayer?.path = path.CGPath 
     self.circleLayer?.fillColor = UIColor.clearColor().CGColor 
     self.circleLayer?.strokeColor = self.tintColor.CGColor 
     self.circleLayer?.lineWidth = CGFloat(2.0) 
     self.circleLayer?.rasterizationScale = 2.0 * UIScreen.mainScreen().scale 
     self.circleLayer?.shouldRasterize = true 

     self.layer.addSublayer(self.circleLayer!) 
     } 



     func addCircleAnimation() { 

      let animation = CABasicAnimation(keyPath: "strokeStart") 
      animation.fromValue = 0.0 
      animation.toValue = 1.0 

      animation.duration = CFTimeInterval(floatLiteral: 1) 
      animation.removedOnCompletion = false 
      animation.fillMode = kCAFillModeBackwards 
      animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 

      animation.beginTime = CACurrentMediaTime() 
      animation.delegate = self 
      self.circleLayer?.addAnimation(animation, forKey:"strokeStart") 

     } 
    } 

は、しかし、それは私がanimationDidStopで検出した場合でも、それはまだちらつきの効果があり、元の円を残します。このコードで何が問題になっていますか?

+0

あなたはanimationDidStopでcircleLayerを削除することができますし、animating.Youが – firstinq

+0

以下の回答でコードを試すことができた後、円が消えます私はむしろ 'kCAFillModeBackwardsを使用するよりも、問題を発見しました'' kCAFillModeForwards'を使う必要がありました。しかし、私がその理由を知らないので、より良い説明のために正解を隠すでしょう。 –

答えて

0

円の層を除去するためのコード:

class CircleView: UIView { 
    private var circleLayer: CAShapeLayer? 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     self.commonInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.commonInit() 
    } 

    func commonInit() { 
     self.tintColor = UIColor.lightGrayColor() 
     self.backgroundColor = UIColor.clearColor() 
    } 

    override func drawRect(rect: CGRect) { 
     super.drawRect(rect) 
     self.drawCircle() 
     self.addCircleAnimation() 
    } 
    override func animationDidStop(anim: CAAnimation, finished flag: Bool) 
    { 
     self.circleLayer?.removeFromSuperlayer() 
    } 

    func drawCircle() { 
     let size:CGFloat = CGFloat(100) 
     self.circleLayer?.removeFromSuperlayer() 
     self.circleLayer = CAShapeLayer() 
     self.circleLayer?.frame = self.bounds 
     let radius = size/2; 
     let path = UIBezierPath(arcCenter: CGPointMake(size/2, size/2), radius: radius, startAngle: -CGFloat(M_PI)/4, endAngle: 2 * CGFloat(M_PI) - CGFloat(M_PI)/4, clockwise: true) 
     self.circleLayer?.path = path.CGPath 
     self.circleLayer?.fillColor = UIColor.clearColor().CGColor 
     self.circleLayer?.strokeColor = self.tintColor.CGColor 
     self.circleLayer?.lineWidth = CGFloat(2.0) 
     self.circleLayer?.rasterizationScale = 2.0 * UIScreen.mainScreen().scale 
     self.circleLayer?.shouldRasterize = true 

     self.layer.addSublayer(self.circleLayer!) 
    } 


    /** UPDATED. Add animation for strokEnd instead of strokeStart **/ 
    func addCircleAnimation() { 

     let animation = CABasicAnimation(keyPath: "strokeEnd") 
     animation.delegate = self 
     animation.fromValue = 0.0 
     animation.toValue = 1.0 

     animation.duration = CFTimeInterval(floatLiteral: 1) 
     animation.removedOnCompletion = false 
     animation.fillMode = kCAFillModeBackwards 
     animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 

     animation.beginTime = CACurrentMediaTime() 
     animation.delegate = self 
     self.circleLayer?.addAnimation(animation, forKey:"strokeEnd") 


    } 
} 
+0

私は知っている、それはまだ私にちらつき効果を与える、それは完全に描かれ、それが削除されていることを意味します。 –

+0

"strokeEnd"でアニメーションを試してみましょう。回答が更新されました。 – firstinq

+0

Start - > Endを使用すると、ちらつき効果が維持されます。 End - > StartまたはEnd - > Endを使用すると、円が消えずに表示されます。 –

関連する問題