我有一个视图,我想移动到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)
答案 0 :(得分:1)
如果您在Interface Builder中有约束,请从card
中移除约束并重试 - 您会发现它按预期工作。
为具有约束的视图设置动画时,首先更新约束常量,然后在动画块内调用self.view.layoutIfNeeded()
。直接动画属性会产生意想不到的结果,如您在示例中所见。