在推送UINavigationController时动画UIView

时间:2011-05-03 19:33:49

标签: iphone ios animation uiviewcontroller uinavigationcontroller

以下情况。 我有一个使用UINavigationController进行导航的应用程序。

对于推送特殊导航控制器,我想要一个自定义动画,缩小。 我到目前为止看起来很好,唯一的问题是,“旧的”Viewcontroller在动画开始之前消失了,所以新的viewcontroller缩小了“nothing”,而不是在后台查看旧的viewcontroller。

为了更好地观看,我创建了一个简单的示例应用:download

enter image description here enter image description here enter image description here

是否有人知道,如何动画新的视图控制器(image3),旧的视图控制器(image1)在动画时保留在背景中(图像2)?

/* THIS CANNOT BE CHANGED */
    AnimatedViewController *animatedViewController = [[AnimatedViewController alloc] initWithNibName:@"AnimatedViewController" bundle:nil];

    /* THIS CAN BE CHANGED */
    animatedViewController.view.transform = CGAffineTransformMakeScale(0.01, 0.01);
    [UIView beginAnimations:@"animationExpand" context:NULL];
    [UIView setAnimationDuration:0.6f];
    animatedViewController.view.transform=CGAffineTransformMakeScale(1, 1);
    [UIView setAnimationDelegate:self];
    [UIView commitAnimations];

    /* THIS CANNOT BE CHANGED */
    [self.navigationController pushViewController:animatedViewController animated:NO];

其他信息:我的应用程序并不那么简单。我为我的应用程序使用了three20框架,但视图控制器的推送和创建就是three20所做的。我只能挂钩(我的代码中的THIS CAN BE CHANGED)之间的部分。我无法在此之前和之后更改代码(除非经过大量研究)。

2 个答案:

答案 0 :(得分:9)

我很快就把它鞭打了。我们的想法是在缩放动画完成后调用pushViewController。

-(IBAction)animateButtonClicked:(id)sender {
    animatedViewController = [[AnimatedViewController alloc] initWithNibName:@"AnimatedViewController" bundle:nil];
    animatedViewController.view.transform = CGAffineTransformMakeScale(0.01, 0.01);

    [UIView animateWithDuration:0.6
                     animations:^{
                         [self.view addSubview:animatedViewController.view];
                         animatedViewController.view.transform=CGAffineTransformMakeScale(1, 1);                     
                     }
                     completion:^(BOOL finished){ 
                         [animatedViewController.view removeFromSuperview];
                         [self.navigationController pushViewController:animatedViewController animated:NO];
                     }];

}

答案 1 :(得分:0)

好的,这样做的一种方法(有点难看)是做动画,完成动画后,执行pushViewController。当您进行动画制作时,您需要为即将呈现的视图控制器的屏幕设置动画。由于动画以新视图结束,当新视图进入屏幕时,不应该更改任何内容,因为它与刚刚设置的动画视图相同。