【问题标题】:Combining autolayout with core animation将自动布局与核心动画相结合
【发布时间】:2014-05-10 19:04:40
【问题描述】:

我是核心动画的新手,我正在为一件事苦苦挣扎 - 如何将自动布局与核心动画结合起来。实际上我在Core Animation的文档中只找到了一句话,这里指的是Autolayout

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

但正如我所尝试的那样,一切都不像看起来那么严格。 这是我的场景。

我设计了一个广泛使用自动布局的滑动菜单。这是该视图的外观。

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

您在 gif 中看到的动画仅通过自动布局实现。我只是在滑动菜单的高度约束中添加了outlet,并以这种方式进行了更改:(代码是使用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;
            });
    }

现在我想获得更复杂的外观过渡。 CLICK HERE 看看我想要达到的效果。

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

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

在这种情况下,最佳做法是什么 - 当您有复杂的自动布局并且您需要在自动布局更改之间自定义 Core Animation 过渡时?我希望我很好地描述了这个问题。 谢谢你的回答。

【问题讨论】:

    标签: ios xamarin.ios core-animation autolayout


    【解决方案1】:

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

    但是,我注意到您的代码中有一件奇怪的事情:您更改了约束 (this.slideMenuHeightConstraint.Constant = height) in 动画块上的常量,而不是在它之前。对于我能想象到的几乎所有情况,您应该在动画块之前更改约束。直到下一个 UI 运行循环(或通过setNeedsUpdateConstraints 强制它用于下一个运行循环)或立即通过layoutIfNeeded 之前,约束不会在视觉上呈现。由于[UIView animate:...] 正在为您执行此操作,因此在为自动布局设置动画时,layoutIfNeeded 应该(通常)是您的动画块中的唯一项。

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

    【讨论】:

    • 在块内部或外部设置约束几乎没有区别 - 关键是约束在 layoutIfNeeded 调用完成之前完成,并且 layoutIfNeeded 调用在块内部完成。
    • 感谢 graymouser 的回答。我是用其他方式做的,我将发布代码,我有空的时候写了解释。
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2017-10-21
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多