将自动布局与核心动画相结合

kyu*_*yan 6 core-animation xamarin.ios ios autolayout

我是核心动画的新手,我正在努力解决一件事 - 如何将autolayout与核心动画结合起来.实际上我在Core Animation的文档中只找到了一个句子,这里引用的是Autolayout

记住将视图约束更新为动画的一部分 如果使用基于约束的布局规则来管理视图的位置,则必须删除可能会影响动画的任何约束,作为配置动画的一部分.约束会影响您对视图的位置或大小所做的任何更改.它们还会影响视图与其子视图之间的关系.如果要为这些项中的任何项设置动画,则可以删除约束,进行更改,然后应用所需的任何新约束.

但是,正如我所做的那样,所有人并不像看起来那样直截了当.这是我的情景.

我设计了一个广泛使用自动布局的滑动菜单.这是该视图的外观. 在此输入图像描述

我正在使用自动布局约束来强制在滑动菜单中按比例定位这些项目.其实有一个很大的制约那里,我没有要发布的所有那些在我的问题,甚至可能是他们并不需要这个问题的直接回答,但是如果需要的话我可以更新这些职位限制.

您在gif中看到的动画仅通过autolayout到达.我只是说出口,以滑动菜单的高度约束,并以这种方式改变了它:(代码使用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;
            });
    }
Run Code Online (Sandbox Code Playgroud)

现在我希望获得更复杂的外观过渡.点击这里查看我想要达到的效果.

只是为了尝试我尝试用一​​系列CABasicAnimations 来实现该动画的消失部分,但是它不成功,我得到了奇怪的行为.

任何人都可以建议我应该在这做什么吗?是否可以使用autolayout来计算视图的位置,但以某种方式覆盖自动布局大小更改之间的动画?我的意思是在我的具体例子中,而不是按比例减小菜单中所有按钮的大小,我需要将FadeOut动画添加到它们,将边界设置为零,并从按钮到按钮从根本上增加动画的开始时间以获得效果我想要的.或者我可能需要完全摆脱autolayout并手动计算大小和动画?

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

gre*_*ser 0

这是完全可行的,虽然它可能很复杂,因为它看起来像您想要的案例将有多个动画。

但是,我注意到代码中的一件事很奇怪:您更改了动画块中约束 ( this.slideMenuHeightConstraint.Constant = height)上的常量,而不是之前的常量。对于我能想象的几乎所有情况,您应该在动画块之前更改约束。约束不会在视觉上呈现,直到下一个 UI 运行循环(或通过强制它进行下一个运行循环),或立即通过。既然是为你做这件事,在动画自动布局时, (通常)应该是你的动画块中唯一的东西。setNeedsUpdateConstraintslayoutIfNeeded[UIView animate:...]layoutIfNeeded

然而,在您的情况下,您必须使动画有些反应性 - 例如,如果您想像示例中那样添加这些按钮,并让它们弹出、动画出来并增长。调用后layoutIfNeeded,您可以安全地检查帧大小。如果它超出了您的阈值(或其他一些指标),您可以触发按钮的动画。(所以,是的,这可能是我在动画块中添加更多代码的情况 - 检查阈值,开始其他动画等)。