iPhone 模态视图动画帮助

Posted

技术标签:

【中文标题】iPhone 模态视图动画帮助【英文标题】:iPhone Modal View Animation Help 【发布时间】:2011-07-21 18:32:29 【问题描述】:

我没有做过很多动画,我需要一些帮助。我有一个tabBarController 作为我的根控制器,我想要另一个tabBarController,我想把它作为一个模态视图控制器,但我的动画有问题。

modalViewControllers目前有四种动画,分别是

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

我想要一个不同的动画 - 从右向左滑动。 - 如何制作这个动画?

有什么帮助吗?


编辑:

我将 tabBarController 推送到导航堆栈的想法很糟糕! Apple 对这种方法的评论:

您永远不想将标签栏控制器推送到导航控制器的导航堆栈上。这样做会造成一种不寻常的情况,即 选项卡栏仅在特定视图控制器位于导航堆栈顶部时出现。标签栏被设计为持久性,因此这种临时方法可能会让用户感到困惑。

我没有想法。有人帮我处理模态视图控制器的动画。

【问题讨论】:

总有UIModalTransitionStyle,可惜没有匹配导航控制器过渡风格的动画。我认为您应该使用您的替代想法并使用导航控制器。 【参考方案1】:

您可以手动编写动画代码。以下是一般步骤:

创建UIViewController 的子类(本质上是一个用于容纳UITabBarController 的无用控制器) - 我通常称之为ShellViewController。 在ShellViewControllerinit 方法中(无论您使用哪一种),将其frame 设置在屏幕外的右侧,例如[self.view setFrame:CGRectMake(320, 0, 320, 480)];ShellViewController 中创建两个方法 - (void)presentSelf - (void)dismissSelf 当你想展示你的UITabBarController 时,创建一个ShellViewController 的实例 将UITabBarController 实例放在ShellViewController 实例中 致电[currentView addSubview:shellViewController.view]; 使用上面的自定义方法来显示和关闭ShellViewController 容纳您的UITabBarController 根据您的业务逻辑处理内存管理

这里是动画输入的代码(例如- (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,它就构成了一个很好的可重复使用的sn-p。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

为什么在模态视图上需要一个标签栏?通常,模态视图用于数据输入、音频播放等。tab bar HIG 声明“通常,使用标签栏在应用程序级别组织信息”。在模态视图控制器中有一个标签栏打破了这一点。当然,不必完全遵循 HIG 中的每条准则,但在这种情况下,您确实应该考虑遵循 Apple 的建议。

您能否详细介绍一下您的具体用例,以便我们就合适的解决方案提出建议?也许分段控件更合适?

【讨论】:

我想创建滑动标签栏。但决定为下一组 tabBarItems 调出一个模态视图。为此,我需要一个滑动动画-***.com/questions/6700184/…

以上是关于iPhone 模态视图动画帮助的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 用另一个模态视图覆盖模态视图

iOS - 目前的模态视图控制器会导致一些动画伪影(iPhone)

iPhone:在为导航栏显示/隐藏设置动画时无法为 contentInset 设置动画

iPhone - 在另一个模态视图中嵌套当前模态视图

iPhone:模态视图未关闭

显示模态视图时使 iPhone 状态栏消失?