在UIView.animateWithDuration的完成块中添加视图

时间:2015-09-29 20:15:54

标签: ios swift uiview uiviewanimation completion

我有一个视图,我想移动到UIView.animateWithDuration主视图的中心。我希望使用ViewController来完成此操作。在方法的完成块中,我想添加第二个视图。

import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func viewDidAppear(animated: Bool) { animation() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBOutlet weak var card: UIView! func animation() { print("viewCenter \(self.view.center)") print("cardCenter 1 \(self.card.center)") UIView.animateWithDuration(1.0, delay: 2.0, options: UIViewAnimationOptions.CurveLinear, animations: { () -> Void in self.card.center = self.view.center print("number of constraints on card: \(self.card.constraints.count)") }, completion: { finished in print("cardCenter 2 \(self.card.center)") let rect = CGRect(x: 200, y: 300, width: 50, height: 50) let tempView = UIView(frame: rect) tempView.backgroundColor = UIColor.blueColor() self.view.addSubview(tempView) self.view.layoutIfNeeded() print("cardCenter 3 \(self.card.center)") }) } 课程的代码下方。我在故事板中设置了视图并通过Outlet连接了

card

}

动画工作正常,直到完成执行的那一刻。第一个视图显示在动画之前的初始位置。然而,在控制台中,视图中心的打印坐标与主视图的中心匹配

控制台输出

viewCenter  (160.0, 284.0)  
cardCenter 1 (140.0, 92.0)  
cardCenter 2 (160.0, 284.0)  
cardCenter 3 (160.0, 284.0)  

在完成块中添加UIView时,有人能解释这种行为吗?

修改

根据Chris的评论,我添加了一些关于self.view.layoutIfNeeded()
的约束的记录 {{1}}完成。现在控制台输出确实显示了视图的初始坐标

新控制台输出

viewCenter(160.0,284.0)
cardCenter 1(140.0,92.0)
卡上的约束数量:0
cardCenter 2(160.0,284.0)
cardCenter 3(140.0,92.0)

1 个答案:

答案 0 :(得分:1)

如果您在Interface Builder中有约束,请从card中移除约束并重试 - 您会发现它按预期工作。

为具有约束的视图设置动画时,首先更新约束常量,然后在动画块内调用self.view.layoutIfNeeded()。直接动画属性会产生意想不到的结果,如您在示例中所见。