从视图控制器动画负 y 原点打破约束

Posted

技术标签:

【中文标题】从视图控制器动画负 y 原点打破约束【英文标题】:Animating negative y origin from view controller breaks constraints 【发布时间】:2016-02-16 09:52:31 【问题描述】:

我有 2 个视图控制器,我们将它们称为 ViewControllerAViewControllerB 在带有自动布局的情节提要中设置。我想为 2 个视图控制器之间的上/下滑动动画制作动画。

启动时ViewControllerA 在屏幕上可见。当一个动作被触发时,我希望ViewControllerB 向下滑动,所以它的view.origin.y 在动画开始时有一个负值 (-480),在动画结束时它的 view.origin.y 是 0。

然而,当做这个动画时,Xcode 唠叨Unable to simultaneously satisfy constraints.

如果想要使用向上滑动动画从 ViewControllerB 返回到 ViewControllerA 的动画,则 ViewControllerAs view.origin.y 在动画开始和结束时是正值 (480),view.origin.y 是 0而且 Xcode 不会唠叨关于约束的任何事情。

从负 y 值开始制作动画时,我需要考虑什么特别的事情吗?

【问题讨论】:

【参考方案1】:

动画你的约束而不是视图的框架。在使用自动布局时更改视图的框架可能会产生意想不到的结果,您应该始终认为这是不行的。要为约束设置动画,您只需调用:

constraint.constant += 200 // where constraint is NSLayoutConstraint
view.setNeedsUpdateConstraints()
UIView.animateWithDuration(0.3)  () -> Void in
    view.layoutIfNeeded()

【讨论】:

在这种情况下,我正在为 2 个视图控制器制作动画,而不是 view 的某个子视图。我正在使用UIViewControllerAnimatedTransitioning。我认为您的建议更适用于为视图控制器的 view 设置动画子视图。 我明白了,公平点。只是为了确定,您可能希望在动画之前打印出视图的约束,以确保您不会产生意外的冲突。您使用的是动画过渡委托吗? 是的,我正在使用动画转换代理。就像我写的那样,动画效果很好,但当 y 原点为负时就不行了,这很奇怪。

以上是关于从视图控制器动画负 y 原点打破约束的主要内容,如果未能解决你的问题,请参考以下文章

使用 SnapKit 时无法正确设置动画

后续布局后UIView框架负原点

动画子视图控制器视图

如何在视图控制器中为 xib 约束设置动画?

CollectionView 约束打破

顶部安全区域约束动画