将自动布局与核心animation结合在一起

我是新来的核心animation,我正在努力与一件事 – 如何结合自动布局与核心animation。 其实我在核心animation的文档中只发现了一句,这里引用了Autolayout

请记住将视图约束更新为animation的一部分如果您使用基于约束的布局规则来pipe理视图的位置,则必须删除可能会干扰animation的任何约束,作为configuration该animation的一部分。 约束会影响您对视图的位置或大小所做的任何更改。 它们也影响视图与其子视图之间的关系。 如果您正在对这些项目中的任何项目进行animation更改,则可以删除约束,进行更改,然后应用所需的任何新约束。

但是,正如我所尝试过的,并不像看上去那样两面派。 这是我的情况。

我devise了一个广泛使用自动布局的滑动菜单。 这是这个观点的外观。 在这里输入图像说明

我使用自动布局约束来强制滑动菜单中的这些项目的比例定位。 其实这里有很多的限制,我不想在我的问题中发表所有这些,甚至可能是他们不需要直接回答这个问题,但是如果你需要他们,我可以更新那些post限制。

您在gif中看到的animation仅通过自动布局来达到。 我只是添加了出口到滑动菜单的高度约束,并以这种方式改变它:(代码是用Xamarin Monotouch编写的,但是我相信应该清楚这里为纯iOS开发者所做的)

private void AnimateSlideMenuAppearance() { float height; if (isSlideMenuShown) { height = 0; } else { height = slideMenuHeight; } UIView.Animate (0.4, delegate { this.slideMenuHeightConstraint.Constant = height; this.View.LayoutIfNeeded (); }, delegate { isSlideMenuShown = !isSlideMenuShown; }); } 

现在我想获得更复杂的外观过渡。 点击这里看看我想达到的效果。

试着用CABasicAnimation系列来实现这个animation的消失部分,但是不成功,我得到了奇怪的行为。

有人可以提出我应该在这里做什么? 有可能使用自动布局来计算视图的位置,但以某种方式覆盖自动布局大小更改之间的animation? 我的意思是在我的具体的例子,而不是按比例减less菜单中的所有button的大小,我需要添加FadeOutanimation给他们,animation的界限为零,也从根本上animation的开始时间从根本上增加,以获得效果我想要的。 或者可能是我需要彻底摆脱自动布局,并手动计算大小和animation?

这种情况下的最佳做法是什么 – 当你有复杂的自动布局,你需要自动布局更改之间的自定义核心animation转换? 我希望我能很好的描述这个问题。 谢谢您的回答。

这是完全可行的,虽然它可能是复杂的,因为它看起来像你想要的情况下会有多个animation。

然而,我注意到你的代码中有一件事情是奇怪的:你改变了animation块中的约束( this.slideMenuHeightConstraint.Constant = height )上的常量,而不是在它之前。 对于几乎所有我能想象到的情况,您应该在animation块之前更改约束。 直到下一个UI运行循环(或通过setNeedsUpdateConstraints强制执行下一个运行循环),或直接通过layoutIfNeeded ,约束不会直观地呈现。 而且由于[UIView animate:...]正在为你做这个, layoutIfNeeded应该(通常)是你的animation块中唯一的animation自动布局的animation。

在你的情况下,你将不得不使animation有些反应 – 例如,如果你想像这个例子那样添加这些button,让它们popup,animation出来,并成长。 调用layoutIfNeeded ,可以安全地检查帧的大小。 如果超出阈值(或其他度量),则可以触发button的animation。 (所以是的,这可能是一个情况,我会添加更多的代码内的animation块 – 检查阈值,开始其他animation等)。