为什么我的CAShapeLayer没有动画? (iOS Swift)

时间:2015-04-05 17:33:19

标签: ios swift animation core-animation

在我的一个ViewControllers中,我在addStatus()下面粘贴了viewDidLoad。我希望这个圆圈的lineWidth能够生成动画,但它似乎并没有这样做。在我寻找原因的过程中,我在Animating Layer Content上找到了Apple的文档部分。我认为重要的部分在这里注明:

  

如果要使用Core Animation类来启动动画,则必须从基于视图的动画块中发出所有Core Animation调用。 UIView类默认禁用图层动画,但在动画块内重新启用它们。因此,您在动画块之外所做的任何更改都不会生成动画。清单3-5显示了如何隐式更改图层的不透明度及其显式位置的示例。在此示例中,myNewPosition变量预先计算并由块捕获。两个动画同时开始,但不透明度动画以默认时序运行,而位置动画以其动画对象中指定的时间运行。

当我查找为什么这可能不是动画时,我读了这篇文章,并认为这意味着我应该将我的CAAnimation放在UIView动画块中。此功能在空白应用程序中工作正常,在放置在rootViewController时没有动画块,但在此应用程序中的辅助viewController中似乎没有动画。任何提示都会非常有用。谢谢!

func addStatus() {

        UIView.animateWithDuration( NSTimeInterval.infinity, animations: { () -> Void in

            let patientZeroIndicator = CAShapeLayer()

            let radius:CGFloat = 20.0
            let center:CGPoint = CGPointMake(self.view.frame.width - radius - 10, radius + 10)
            let startAngle = 0.0
            let endAngle = 2.0 * Double(M_PI)

            patientZeroIndicator.lineWidth = 10.0
            patientZeroIndicator.fillColor = UIColor(netHex: cs_red).CGColor
            patientZeroIndicator.strokeColor = UIColor.whiteColor().CGColor
            patientZeroIndicator.path = UIBezierPath(arcCenter: center, radius: radius, startAngle: CGFloat(startAngle), endAngle: CGFloat(endAngle), clockwise: true).CGPath
            self.view.layer.addSublayer(patientZeroIndicator)

            // Create a blank animation using the keyPath "cornerRadius", the property we want to animate
            let pZeroAnimation = CABasicAnimation(keyPath: "lineWidth")

            // Define the parameters for the tween
            pZeroAnimation.fromValue = 10.0
            pZeroAnimation.toValue = 5.0
            pZeroAnimation.autoreverses  = true
            pZeroAnimation.duration = 3.0
            pZeroAnimation.repeatDuration = CFTimeInterval.infinity
            pZeroAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.25, 0, 0.75, 1)

            // Finally, add the animation to the layer
            patientZeroIndicator.addAnimation(pZeroAnimation, forKey: "lineWidth")
        })
    }

1 个答案:

答案 0 :(得分:6)

  

在我的viewDidLoad

这是你的问题。在将视图添加到窗口之前运行viewDidLoad方法。除非在窗口中,否则您无法向视图添加动画。请改为addStatus中的viewDidAppear:

此外,请勿在动画块中创建新图层。在viewDidLoad

中创建图层