2017-01-22 179 views
1

我有一个CAKeyframeAnimation,它在横向上看起来不错,但是当设备旋转时,与其余内容相比,当设备旋转时,动画当然是不合适的。有没有办法调整(缩放)正在进行的动画的路径?CoreAnimation和设备旋转

编辑:添加代码

 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路径到新坐标系的方法。

+0

你有任何代码可以告诉我们吗? – dfd

+0

所以你说你想改变动画_当它在animating_的中间,因为用户旋转了设备? – matt

+0

确切!因为坐标系改变路径需要更新。我只是不知道该怎么做。 – Chris

回答

0

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

要从UIBezierPath得到CGPoints的数组,你可以使用这个方法:一旦动画开始https://stackoverflow.com/a/36374209/1491675

对于设备旋转,保持参照当前点在动画和设备旋转重新计算路径用新的动画替换现有的动画,而忽略已经发生的部分动画。

+0

我不明白为什么当旋转开始时不停止动画,将视图留在它所在的位置(表示层会给你这些信息),然后用新的动画开始一个新的动画旋转完成后的路径。 – matt

+0

你的意思就像我上面描述的那样? “...在设备上旋转重新计算路径并用新的动画替换现有的动画...” – Chris

+0

如果显示实际的代码,它可能会帮助我(和其他人)。 – matt