用于推送UIViewController的自定义animation

我想在推视图控制器时显示一个自定义的animation:我想实现类似“展开”的animation,这意味着新的视图从一个给定的矩形扩展,让animation中的[100,100 220,380]全屏。

任何build议,从哪里开始,分别是任何文件,教程,链接? 🙂


好的。 我可以使用下面的代码来制作展开animation:

if ([coming.view superview] == nil) [self.view addSubview:coming.view]; coming.view.frame = CGRectMake(160,160,0,0); [UIView beginAnimations:@"frame" context:nil]; [UIView setAnimationDuration:4]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [coming viewWillAppear:YES]; [going viewWillAppear:YES]; coming.view.frame = CGRectMake(0, 0, 320, 480); [going viewDidDisappear:YES]; [coming viewDidAppear:YES]; [UIView commitAnimations]; 

我的视图正确显示,但不幸的是导航栏不更新。 有没有办法做到这一点手动?


在示例代码中,函数被全部调用了0.03秒,用于更新视图的转换。 不幸的是,当推UIViewController ,我无法调整视图的框架…我是吗?

你可以做的是推动下一个视图控制器,但不要animation,如下所示:

 [self.navigationController pushViewController:nextController animated:NO]; 

…然后,在推入的视图控制器中,您可以使用CoreAnimation为其视图执行自定义animation。 这可能是在viewDidAppear:(BOOL)animated方法中最好的。

看看核心animation指南关于如何实际做animation。 特别注意隐式animation。

编辑: 更新的链接

我使用以下函数(添加到UINavigationController )来自定义推动animation:

 - (void) pushController: (UIViewController*) controller withTransition: (UIViewAnimationTransition) transition { [UIView beginAnimations:nil context:NULL]; [self pushViewController:controller animated:NO]; [UIView setAnimationDuration:.5]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationTransition:transition forView:self.view cache:YES]; [UIView commitAnimations]; } 

我想你可以适应这个代码来做任何你想要的animation。

您正在寻找的代码:

  [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.80]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO]; [self.navigationController pushViewController:menu animated:YES]; [UIView commitAnimations]; 

海因里希,

我已经做了一个YouTubevideo教程,展示如何使视图扩大和缩小,就像在Facebook的iPhone应用程序。

希望能有所帮助: 如何使iPhone SDK的扩展/缩小视图

亚当

@zoul:这很好! 我只是改变“self”到“self.navigationController”和“self.view”到“self.navigationController.view”不知道这是否是必要的,但它的工作。 和@crafterm一样,通过在viewDidLoad或ViewWillAppear中添加下面的代码来创build自己的leftBarButtonItem:

 //add your own left bar button UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)]; self.navigationItem.leftBarButtonItem = backButton; [backButton release]; 

然后我只是调整了push函数,并在我的-backButtonTapped方法中调用了这个popWithTransition函数。

 - (void) popWithTransition: (UIViewAnimationTransition) transition { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:.75]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES]; [UIView commitAnimations]; [self.navigationController popViewControllerAnimated:NO]; } 

请注意,在animation之后,popViewController调用被移动到最后。 不知道这是否犹太教,但它再次运作。

你想要的是iPhone开发者食谱第2章的下载。 虽然任何核心animatin样品都会帮助你,但请特别注意affineRotate样品。

看看ADTransitionController ,它是我们在Applidium创build的自定义转换animation(它的API匹配UINavigationController的API)的UINavigationController的替代品。

您可以使用不同的预定义animation进行推动popup操作,例如滑动淡入淡出多维数据集卡鲁塞尔等。 在你的情况下,你要求的animation就是Zoom