UIView动画在动画期间确定中心

时间:2011-07-01 08:37:22

标签: ios animation uiview nstimer center

我正在使用UIView的+ animateWithDuration:delay:options:animations:completion:方法在几秒钟左右的时间内沿着一条线移动我的视线。

我想在此动画期间的任意时间确定UIView所在的路径以及它正在移动的路径。但是,当我执行此操作并尝试访问centerframe时,我发现该位置已设置为其最终目的地。

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

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

或者......有没有更好的方法来做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:10)

UIViews由CALayers支持,它是执行实际动画的图层。 CALayer公开了一个属性presentationLayer,当访问该属性时,它返回CALayer的副本,该副本尽可能地表示用户可见的当前状态。通过询问view.layer.presentationLayer.frame,您可以立即获得用户可见的图层框架,这对应于UIView的框架。

答案 1 :(得分:0)

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

CALayer有一个presentation()函数

  

func presentation()   返回表示层对象的副本,该副本表示当前在屏幕上显示的图层状态。

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

演示

enter image description here

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()
    }
}