处理自动布局和核心动画之间的冲突

时间:2017-04-19 16:38:59

标签: swift autolayout core-animation uiviewanimation ios-autolayout

我正在使用大量动画制作应用程序:)。 我使用自动布局来布局视图。然后我使用Core Animation来制作动画。

我的问题是处理自动布局约束和核心动画之间冲突的最佳做法是什么?

例如,我有约束来指定视图的位置。然后我使用核心动画将这个视图向下移动100pt。问题是在动画完成后,自动布局约束将该视图拉回到原始位置。

我在想的是停用视图的限制以及其位置依赖于此视图的其他视图。然后继续执行核心动画的东西。

有什么想法?我真的很感激。

已更新: 我才想通了。完成Core Animation之后,只需更新约束的常量。

2 个答案:

答案 0 :(得分:1)

假设您有一个100x100的UIView,以屏幕为中心。现在你想把它移动50点。对于初学者,您(至少)有以下约束:

let myCenterX = squareView.centerXAnchor.constraint(equalTo: view.centerXAnchor
let myCenterY = squareView.centerYAnchor.constraint(equalTo: view.centerYAnchor
let mySquareSize = squareView.heightAnchor.constraint(equalToConstant: 100)
let mySquareConstraint = squareView.widthAnchor.constraint(equalTo: squareView.heightAnchor.isActive
myCenterX.isActive = true = true
myCenterY.isActive = true = true
mySquareSize.isActive = true = true
mySquareConstraint.isActive = true = true

(有几种方法可以制作100x100 UIView,但这只是一种。)

现在您要更改 centerYAnchor 并制作动画:

myCenterY.constant = 100
UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() }
  • 我假设此代码是视图控制器的一部分。第一组可以放在 viewDidLoad 中,至少是如何编写的。
  • 我试图做一个快捷方式 - 将 isActive = true 添加到声明中。它构建没问题,但Xcode没有认识到它是NSLayoutConstraint。
  • 将动画持续时间更改为您喜欢的任何内容。

我已经显示一种方式 - 使用锚点。但另外两种做自动布局的方法(至少是 NSLayoutConstraint 的详细声明)也可以。 (老实说,我不知道VFL(视觉格式语言)能否处理变化的常数 - 我相信它可以。

主要是你(1)更改你想要的约束,然后(2)告诉你的视图动画你所做的更改。

答案 1 :(得分:-1)

您必须更改约束的常量值,然后为视图设置动画。

例如:

leadingMenuConstraint.constant = 0;
[self.view setNeedsUpdateConstraints];

[UIView animateWithDuration:0.5f animations:^{
    [self.view layoutIfNeeded];
}];