0

我正在使用很多动画的应用程序:)。 我使用自动布局来布置视图。然后我使用Core Animation进行动画制作。处理自动布局和核心动画之间的冲突

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

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

我在想的是取消激活那些视图和其他视图的约束,这些视图的位置也取决于这个视图。然后继续并执行核心动画的东西。

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

已更新: 我刚想通了。核心动画的东西完成后,只需更新约束的常量。

+1

您动画的约束,而不是位置。请参阅https:// stacko verflow。COM /问题/ 12622424 /怎么办 - 我 - 动画 - 约束的变化。 – kennytm

+0

该职位只是一个例子。我确实使用了自动布局约束,更改了它们的常量 –

回答

1

假设你的UIView是100x100,以屏幕为中心。现在你想把它降低50点。对于初学者来说,你有(至少)以下限制:(有一些方法可以让一个100×100的UIView,这只是一个)

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 

现在要变化centerYAnchor和动画:

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

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

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

+0

谢谢@dfd。我明白你在说什么。但我想要的是通过Core Animation进行动画,而不是Auto Layout Constraint的变化常量。原因是我正在使用RK4 Spring的Spring Animation,而不是Apple提供的UIKit Spring。所以我不能像你展示的那样在UIView中使用动画方法。我正在使用来自Flinto的https://github.com/flinto/spring –

-1

你必须改变约束的恒定值,然后动画视图

例如:

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

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

核心动画内容如何?这仅适用于使用自动布局的动画 –