53

我想在推视图控制器时显示一个自定义动画:我想实现类似于“展开”的动画,这意味着新视图从给定的矩形扩展,可以说[100,100 220,380]在动画期间全屏显示。推送一个UIViewController的自定义动画

任何建议,从哪里开始,分别是任何文档,教程,链接? :)


好的。我可以使动画扩展用下面的代码:正确显示

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时,我无法调整视图的框架...我是吗?

回答

25

你可以做的是推动下一个视图控制器,但没有设置动画,就像这样:

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

......然后,在所得到推在视图控制器,你可以这样做使用CoreAnimation进行视图的自定义动画。这可能最好在viewDidAppear:(BOOL)animated方法中完成。

请查看Core Animation Guide了解如何实际执行动画。特别注意隐式动画。

编辑:updated link

+3

我已经尝试了这种方法,但问题在于,当您使用此推送时,第一个视图控制器会在下一个控制器启动动画之前消失。应该发生的事情是:1)下一个视图控制器动画,其视图完全覆盖旧的vc视图,然后弹出旧的vc。我正在编译的iOS 4.3,这是行不通的。 – SpaceDog 2012-10-05 10:47:21

+1

这不可扩展。导航控制器应该处理动画。这是一个黑客,你必须为每个推送的视图控制器实施。 – 2014-01-20 03:39:06

3

你想要的是iphone developers cookbook第2章的下载。虽然任何核心animatin样本都会帮助您,但请特别注意affineRotate样本。

+0

谢谢。我会解决它。 – Erik 2009-09-10 16:45:39

52

我使用下面的函数(加入UINavigationController)自定义推送动画:

- (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]; 
} 

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

+2

不错的一个,你如何处理popViewController案例?从我所看到的,叩击背部按钮不会调用任何给定的目标/选择器对即使你重载后退按钮,并提供一个,这样你就可以将它设置为指向,其中包括动画自定义弹出的方法? – crafterm 2010-07-25 08:35:36

+0

我记得有一段时间与自定义动画战斗,然后去一些不那么痛苦的解决方案。我不记得我最终使用的是什么,但它可能类似于接受的答案(或者我简单地放弃并使用了工厂转换)。 – zoul 2010-07-26 10:45:33

+1

我在哪里写这个代码? – ichanduu 2012-06-13 10:23:23

7

@zoul:这很棒!我只是改变了“self”到“self.navigationController”和“self.view”到“self.navigationController.view”不知道这是否是必要的,但它的工作。和@crafterm,作为弹出回来,只是让自己leftBarButtonItem通过增加viewDidLoad中或viewWillAppear中此代码:

//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]; 

然后,我只是调整了推送功能和使这个popWithTransition功能,我在我的-backButtonTapped方法称为。

- (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]; 
} 

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

10

海因里希,

我已经做了YouTube的教程显示如何让意见膨胀和收缩,就像在Facebook的iPhone应用程序。

希望能有所帮助:How to make expanding/shrinking views on iPhone SDK

亚当

+0

好一个非常有用的同我 – harshalb 2010-10-20 05:08:57

+0

@Adam,所以我一直在向你学习iPad应用程序的教程。我注意到横向模式下的动画中心不正确。在横向模式下必须做些什么来确保动画看起来正确?我需要告诉动画的起始边界应该在哪里。 – topwik 2013-06-27 19:45:48

34

您正在寻找的代码:

[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]; 
+0

如何处理popViewController方案? – Ans 2014-04-23 11:13:19

3

看一看ADTransitionController,在更换下降为UINavigationController的自定义在Applidium创建的过渡动画(其API与UINavigationController的API匹配)。

您可以使用不同的预先定义动画为流行行动,如刷卡淡出立方卡鲁塞尔等。在你的情况下,你正在请求的动画是一个叫做缩放