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
。
在ShellViewController
的init
方法中(无论您使用哪一种),将其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 模态视图动画帮助的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 目前的模态视图控制器会导致一些动画伪影(iPhone)