在iOS 12 beta 12下的Swift 4.2中,我想获取我在CAKeyframeAnimation
中沿路径动画的点的当前位置。
动画的代码是这样的:
@IBOutlet weak var dot: UIImageView!
func animateDot() {
// Oval path.
let ovalWidth = UIScreen.main.bounds.width * 0.7
let ovalHeight = UIScreen.main.bounds.height * 0.75
let ovalPath = UIBezierPath(ovalIn: CGRect(x: -ovalWidth / 2 , y: -ovalHeight / 2, width: ovalWidth, height: ovalHeight))
let orbit = CAKeyframeAnimation(keyPath: "position")
orbit.path = ovalPath.cgPath
orbit.duration = CFTimeInterval(2.5)
orbit.isAdditive = true
orbit.repeatCount = 6
orbit.calculationMode = kCAAnimationPaced
orbit.rotationMode = kCAAnimationRotateAuto
self.dot.layer.add(orbit, forKey: "orbit")
}
我的问题是:一旦启动并运行它,如何在Swift中查询动画以获取点中心的当前屏幕xy?
答案 0 :(得分:0)
我发现可以查询与该点关联的 active 表示层,以获得以该点的当前位置为边界的帧:
if (self.dot.layer.presentation() != nil)
{
let dotLocation = self.dot.layer.presentation()?.frame
os_log("self.dot.layer.presentation()?.frame.minX %12f", type: .debug, dotLocation!.minX)
os_log("self.dot.layer.presentation()?.frame.maxX %12f", type: .debug, dotLocation!.maxX)
os_log("self.dot.layer.presentation()?.frame.minY %12f", type: .debug, dotLocation!.minY)
os_log("self.dot.layer.presentation()?.frame.maxY %12f", type: .debug, dotLocation!.maxY)
var dotScreenLocation: CGPoint = CGPoint(x: 0, y: 0)
dotScreenLocation.x = dotLocation!.minX + ((dotLocation!.maxX - dotLocation!.minX) / 2)
dotScreenLocation.y = dotLocation!.minY + ((dotLocation!.maxY - dotLocation!.minY) / 2)
os_log("self.dot.layer.presentation()?.frame center x,y %12f,%12f", type: .debug, dotScreenLocation.x, dotScreenLocation.y)
}