在过渡期间动画子视图控制器的视图
Posted
技术标签:
【中文标题】在过渡期间动画子视图控制器的视图【英文标题】:Animating Child View Controller's views during transition 【发布时间】:2013-09-18 17:10:15 【问题描述】:我有一个主自定义容器视图控制器,其目的是在两个不同的视图控制器之间进行交换,每个视图控制器都管理一个带有文本字段的表单。我们将它们称为 FormVC1 和 FormVC2。这两个控制器的视图都由 XIB 管理。
我可以使用以下方法在 FormVC1 和 FormVC2 之间成功切换:
transitionFromViewController:toViewController:duration:options:animations:completion:
同时将 UIViewAnimationOptionTransitionCrossDissolve
传递给 options
参数。
现在我想稍微甜化一下过渡,当 FormVC1 被解除时,我希望各个文本字段向左飞(一次一个),而当 FormVC2 被呈现时,我想要个人从右侧飞入的文本字段,一次一个。
我对如何设置这一切以及将特定文本字段动画代码放置在何处感到有些困惑。我把它放在Master的动画块中吗?我是否将其放在每个 FormVC 的外观回调中?
【问题讨论】:
【参考方案1】:您有多种选择,因此请选择最适合您的一种:
1) 使容器视图控制器包含一个滚动视图,禁用滚动和禁用滚动条。将两个窗体 vc 设置为容器的子 vc,并将视图添加到彼此相邻的滚动视图中,因此只有一个可见。在适当的时候,通过设置动画设置为 YES 的滚动视图的内容偏移量来显示下一个表单。
2) 更好(更容易扩展以添加任意数量的表单),使用 UICollectionView 而不是基本的滚动视图,将其设置为使用水平线性布局,创建一个自定义单元格来保存您的表单 vc 类(禁用滚动和滚动条),然后显示下一个表单,scrollToItemAtIndexPath:: 应该可以解决问题。
3) 最基本的,也许已经足够好了:让你的容器成为一个导航控制器,然后使用默认的转换推送表单 vc。
所有这些解决方案都假设您的表单 vc 只是您想要动画的控件,并且主视图具有透明背景。
【讨论】:
谢谢,但我已经用动画替换了整个表单。现在,我希望各个文本字段分别起飞和起飞,而不仅仅是 CrossDissolving。 你是说你想要交叉溶解和其他动画?在这种情况下,将所有控件放入容器视图中,当您调用 transitionFromView... 时,您还会执行 [UIView animate... 在其中将容器的框架设置在可见区域的左侧。对出现的视图执行相同的操作,但将初始位置设置在右侧,并让它们动画到它们应该在的位置。【参考方案2】:在transitionFromViewController:toViewController:…
的animations
块中更改要设置动画的元素的帧。为了让它飞到左边,从frame.origin.x
中减去类似 200 的值。要使它们从右侧飞入,请从较高的 x
值(可能为 500)开始并将其设置为动画到中心。
要按顺序对它们进行动画处理,您可以为每个元素使用不同的 x 值。对于更复杂的东西,使用animateWithDuration:delay:options:animations:completion:
并在前者的completion
块中设置下一个动画。你会使用它而不是transitionFromViewController:toViewController:…
。
【讨论】:
好的。所以如果我不打电话给transitionFromVC…
,那么我会将一堆动画块链接在一起并手动添加/删除子视图,对吗?如果我这样做,我还必须手动调用beginAppearanceTransition
和endAppearanceTransition
,对吗?如果我不在,你能提供一个代码示例吗?
是的,transitionFromVC
只是添加/删除 VC 视图的好方法,所以这是您必须手动完成的部分。 appearanceTransition
调用仅在您为 shouldForwardAppearance
内容返回 NO
的情况下。你不需要它们。以上是关于在过渡期间动画子视图控制器的视图的主要内容,如果未能解决你的问题,请参考以下文章