2014-03-31 56 views
6

我是核心动画的新手,我正在努力解决一件事 - 如何将自动布局与核心动画结合起来。其实我发现只有一句话核心动画的是指这里的自动版式文档中是将自动布局与核心动画结合起来

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

但正如我所尝试过的,并不像看起来那样直截了当。 这是我的场景。

我设计了一个广泛使用自动布局的滑动菜单。这是这个观点的外观。 enter image description here

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

您在gif中看到的动画仅通过自动布局来达到。我只是说出口,以滑动菜单的高度约束,并以这种方式改变了它:(代码使用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以查看我想要达到的效果。

只是尝试一下,我试图用系列CABasicAnimation s实现该动画的消失部分,但它不成功,我得到奇怪的行为。

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

这些场景中的最佳做法是什么 - 当您进行复杂的自动布局并且需要在自动布局更改之间进行自定义Core Animation转换时?我希望我能很好地描述这个问题。 谢谢你的回答。

回答

0

这是完全可行的,但它可能很复杂,因为它看起来像你想要的情况下会有多个动画。但是,我注意到你的代码中有一件很奇怪:你在约束(this.slideMenuHeightConstraint.Constant = height改变了动画块的常量,而不是之前。对于几乎所有我能想象到的情况,您应该在之前更改动画块的约束。直到下一个UI运行循环(或通过setNeedsUpdateConstraints强制执行下一个运行循环)或直接通过layoutIfNeeded,视觉呈现约束条件。并且由于[UIView animate:...]正在为您执行此操作,因此在动画自动布局时,layoutIfNeeded应该(通常)是而不是事物。

对于你的情况,你必须使动画有些反应 - 然而 - 例如,如果你想像这个例子那样添加这些按钮,并让它们弹出,动画化和增长。在致电layoutIfNeeded后,您可以安全地检查帧大小。如果超出阈值(或其他度量标准),则可以触发按钮的动画。 (所以是的,这可能是一种情况,我会在动画块中添加更多代码 - 检查阈值,开始其他动画等)。

+0

在块内部或外部设置约束没有什么区别 - 关键是约束在layoutIfNeeded调用完成之前完成,并且layoutIfNeeded调用在块内完成。 – jrturton

+0

谢谢greymouser的答案。我以其他方式做到了,我将发布代码,在有空的时候我会写解释。 – kyurkchyan