CoreAnimation和设备轮换

时间:2017-01-22 19:00:33

标签: swift core-animation screen-rotation

我有一个看起来很棒的CAKeyframeAnimation,但是当设备旋转时,与其他内容相比,animate当然不合适。有没有办法调整(缩放)正在进行的动画的路径?

编辑:添加代码

        let circle = CAShapeLayer()
        circle.path = UIBezierPath(roundedRect: CGRect(x: -60.0, y: -60.0, width: 100.0, height: 100.0), cornerRadius: 50.0).cgPath
        circle.fillColor = UIColor.clear.cgColor
        circle.strokeColor = UIColor.blue.cgColor

        let animation = CAKeyframeAnimation(keyPath: "position")
        animation.duration = (path["endTime"] as! Double) - (path["startTime"] as! Double)
        animation.repeatCount = 0
        animation.path = (path as! UIBezierPath).cgPath
        animation.calculationMode = kCAAnimationPaced
        animation.fillMode = kCAFillModeForwards
        animation.isRemovedOnCompletion = false

        circle.add(animation, forKey: "position")
        self.view.layer.insertSublayer(circle, at: 5)

问题在于UIBezierPath是在纵向或横向中定义的(应用程序支持两者),因此以与创建它相同的方向进行回放没有问题,但是如果您旋转设备,UIBezierPath定义的动画应该是针对新方向进行了更新。我正在寻找一种在动画时更新CAKeyframeAnimation路径到新坐标系的方法。

1 个答案:

答案 0 :(得分:0)

我发现您无法动态调整路径,但您可以根据原始点和计算出的比例/平移点创建新路径。

要从UIBezierPath获取CGPoints数组,您可以使用此方法:https://stackoverflow.com/a/36374209/1491675

对于动画开始后的设备旋转,保持对动画中当前点的引用,并在设备旋转时重新计算路径,并用新的动画替换现有动画,而不包括已经发生的动画部分。 / p>