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

Posted

技术标签:

【中文标题】UIView 动画在动画期间确定中心【英文标题】:UIView animation determine center during animation 【发布时间】:2011-07-01 08:37:21 【问题描述】:

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

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

我这样做的原因是我有一个 NSTimer 每 0.1 秒(或大约)触发一次,这将更新父视图以显示 UIView 之前所在的行。我希望能够在 UIView 移动时保持更新。

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

我知道为时已晚,但也许它可以帮助其他人。

CALayer 有一个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()
    

【讨论】:

以上是关于UIView 动画在动画期间确定中心的主要内容,如果未能解决你的问题,请参考以下文章

如何确定当前是不是正在 UIView 中播放动画?

在动画期间无法正确定位子图层

如何在 UIView 动画期间更新图像视图

在动画期间访问 UIView 的当前位置

在 UIView 动画期间难以允许用户交互

UIVIew/CALayer 动画期间的回调