iPhone模态视图动画帮助

4

我并没有做过很多动画,需要一些帮助。我的根控制器是一个tabBarController,我想要另外一个tabBarController,并且我想将它作为模态视图控制器呈现,但是我在动画方面遇到了问题。

目前有四种modalViewControllers的动画效果:

typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;

我想要一种不同的动画效果 - 从右侧向左侧滑动。 - 我该如何实现这种动画效果? 有人能帮忙吗?
编辑: 我的想法是将tabBarController推入导航堆栈中,但这种方法很烂!苹果对这种方法的评论:

您永远不会希望将选项卡控制器推入导航控制器的导航堆栈中。这样做会创建一种不寻常的情况,即选项卡仅在特定视图控制器位于导航堆栈的顶部时才出现。选项卡被设计为持久存在,因此这种瞬态方法可能会使用户感到困惑。

我已经没有主意了。有人帮我实现模态视图控制器的动画吗?

2
总是有 UIModalTransitionStyle,但不幸的是没有一个动画与导航控制器转换样式相匹配。我认为你应该使用你的替代想法并使用导航控制器。 - Trevor
3个回答

4
您可以手动编写动画代码。以下是一般步骤:
1. 创建一个UIViewController的子类(主要是用来容纳UITabBarController的虚拟控制器),我通常称之为ShellViewController。 2. 在ShellViewControllerinit方法中(使用任何一个你想要使用的方法),将其frame设置在屏幕右侧以外,例如:[self.view setFrame:CGRectMake(320, 0, 320, 480)]; 3. 在ShellViewController内部创建两个方法:
  • - (void)presentSelf
  • - (void)dismissSelf
4. 当您想要呈现UITabBarController时,创建一个ShellViewController的实例。 5. 将您的UITabBarController实例放置在ShellViewController实例内。 6. 调用[currentView addSubview:shellViewController.view];。 7. 使用上述自定义方法来呈现和解除呈现包含您的UITabBarControllerShellViewController。 8. 根据您的业务逻辑处理内存管理。
以下是动画效果的演示代码(例如,- (void)presentSelf方法):
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.15]; //the double represents seconds
[UIView setAnimationDelegate:self];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[[self view] setFrame:CGRectMake(0, 0, 320, 480)];
[UIView commitAnimations];

以下是动画退出的代码(例如- (void)dismissSelf方法):

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.15];
[UIView setAnimationDelegate:self];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[[self view] setFrame:CGRectMake(320, 0, 320, 480)];
[UIView commitAnimations];

请记住,这些动画方法仅仅是用来做动画的。它们不会禁用当前视图或ShellViewController的视图/子视图与之交互的能力。在动画期间,您需要手动禁用用户交互,然后在动画完成后再恢复它。有一个UIView方法可以在动画完成时执行选择器:

[UIView setAnimationDidStopSelector:@selector(enableUserInteraction)];

你可以将此代码放在上面每个动画块的[UIView setAnimationDelegate:self]后面。当然,你需要自己编写enableUserInteraction方法……以及disableUserInteraction方法。
这么做有点麻烦,但它确实有效。一旦你编写好ShellViewController,它就成为了一个不错的可重用代码片段。

1
将您的根标签栏控制器嵌入UINavigationController中。如果它不允许您这样做,请在它们之间插入一个UIViewController(即:UINavigationController嵌入UIViewController,后者添加了UITabBarController的视图)。这很糟糕,但应该可以工作。

0

模态视图控制器不会滑入,因为这是标准的堆栈动画(推送或弹出)。这会让用户感到困惑。如果它是模态的,你真的应该从底部向上滑动或翻转等。

为什么需要在模态视图上使用选项卡栏?通常,模态视图用于诸如数据输入、音频播放等事物。选项卡栏 HIG指出“一般来说,使用选项卡栏来组织应用程序级别的信息”。在模态视图控制器中使用选项卡栏会打破这个规则。当然,不必完全遵循HIG中的每个指南,但这是一个情况,你真的应该考虑遵循苹果的建议。

您能告诉我们更多关于您特定用例的信息,以便我们可以提出适当的解决方案吗?也许分段控件更合适?


我想创建滑动选项卡栏。但是决定为下一组tabBarItems弹出模态视图。我需要一个滑动动画来实现这个目的- https://dev59.com/iFnUa4cB1Zd3GeqPYkHY - Legolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接