UIViewanimation决定中心animation

我正在使用UIView的+ animateWithDuration:delay:options:animations:completion:方法来移动我的观点沿线几秒钟左右的过程。

我想确定,在这个animation的任意时间,UIView是沿着它正在移动的path。 但是,当我这样做,并尝试访问centerframe ,我发现该位置已被设置为它的最终目的地。

我这样做的原因是我有一个NSTimer每隔0.1秒(或左右)发射,它将更新父视图,以显示UIView以前的行。 我希望能够保持这个UIView移动更新。

任何想法如何做到这一点? 我发现的唯一类似的问题是http://forums.macrumors.com/showthread.php?t=1056105 ,但没有显示分辨率。

另外…有没有更好的方法来做到这一点?

谢谢!

UIView由CALayers支持,它是实际animation的图层。 CALayer公开了一个属性presentationLayer ,当访问它时,返回一个CALayer的副本,它尽可能地表示用户可见的当前状态。 通过询问view.layer.presentationLayer.frame你可以得到图层的框架,现在对用户是可见的,这对应于UIView的框架。

我知道它太晚了,但也许它可以帮助别人。

CALayer有一个presentation()函数

func presentation()返回表示层当前出现在屏幕上的状态的表示层对象的副本。

表示层有一个框架属性什么是CGRect,从这里容易计算出中点。

演示

在这里输入图像说明

代码在swift 3

 class ViewController: UIViewController { var circle : UIView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let animator = UIViewPropertyAnimator(duration: 10, curve: .easeInOut) circle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)) circle.layer.cornerRadius = 20.0 circle.backgroundColor = UIColor.blue self.view.addSubview(circle) Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { [weak self] (myTimer) -> Void in if let movingBlueDotFrame = self?.circle.layer.presentation()?.frame { let blueDotOriginPoint = movingBlueDotFrame.origin let blueDotMiddlePoint = CGPoint(x: blueDotOriginPoint.x + movingBlueDotFrame.width/2, y: blueDotOriginPoint.y + movingBlueDotFrame.height/2) print(blueDotMiddlePoint) if blueDotMiddlePoint == CGPoint(x:100,y:100){ print("Yeeaahh") myTimer.invalidate() } } } animator.addAnimations { self.circle.center = CGPoint(x: 100,y: 100) } animator.startAnimation() } }