iPhone CATransition为任何动画的开始和结束添加了淡入淡出效果?

时间:2010-03-03 23:30:32

标签: iphone

所以我刚刚开始为iphone开发一些简单的应用程序。我会说我相当肯定我对多个视图的编程没有很强的理解,但我正在努力学习。

我有一个基于普通窗口的应用程序启动的程序,所以我可以手写一切,希望能够更多地了解我正在做的事情。我有一个视图控制器,用于根据每个其他视图控制器的请求加载和释放视图。没有元素从一个视图持续到另一个视图。

我目前工作正常,但我想在视图更改中添加动画。一个简单的推动画是我的目标。当新视图推进时,一个视图就会推出。

查看CATransitions并尝试使用它,我有一个工作版本(目前用于推动顶部/底部)

        [thisView.view removeFromSuperview];
        [thisView release];
        thisView = [[MenuViewController alloc] initWithNibName:@"MenuView" bundle:nil];
        [self.view addSubview:thisView.view];   

        CATransition *animation = [CATransition animation];
        [animation setDuration:6.3];
        [animation setType:kCATransitionPush];
        [animation setSubtype:kCATransitionFromTop];
        [animation setRemovedOnCompletion:YES];
        [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
        [[self.view layer] addAnimation:animation forKey:nil];

据我所知,这是使用CATransition的非常标准的代码,它可以做我需要的工作,一个视图在另一个视图进入时被推高。但是我的问题是,似乎有一个淡入淡出每个视图分别进入或出现时都会发生。

因此 - 在这个例子中;当菜单从底部向上推时,它将从白色慢慢淡入,并且当前一个视图离开屏幕时,它将慢慢淡入白色。

请注意,持续时间设置为6,因此褪色是戏剧性的。

有没有办法消除这里的褪色,以便每个视图在进出的路上都保持稳固?或者我在这条路线上完全错过了标记?

我感谢任何帮助。道歉我已经啰嗦了。

3 个答案:

答案 0 :(得分:4)

我从来没有找到解决这个问题的方法,但我可以提供合理的解决方法。发生的事情是它不是褪色到白色,而是逐渐淡化到透明,窗口背景(或任何视图背后)是白色的。有几种方法可以解决这个问题:

  1. 更改窗口背景颜色。如果你褪色的两个视图都有相同的纯色背景,那么这看起来会很不错。

  2. 不要在每个视图中渲染背景(例如“MenuView”),而是要始终在这些视图下显示共享背景视图。

  3. 请注意,这不适用于所有情况 - 例如,分组UITableView s始终是完全不透明的。

    (正如我注意到的,我假设您没有构建基于导航的应用程序,在这种情况下,应该自动处理所有动画。)

    如果你还没有另一种方法在视图之间进行转换,你也可以考虑查看UIView方法setAnimationTransition:forView:cache:(虽然它不能做滑动动画,如果你设置了在那)。

答案 1 :(得分:2)

我通过将我已应用效果的视图封装到superview中并通过设置superview属性“clip subviews”来解决这个问题。现在,超级视图会“淡化”淡入淡出。

答案 2 :(得分:0)

通过使用UIView动画,我能够在开始和结束时使视图转换而不会褪色。注意:在下面的代码中,我在主UIView中有一个UINavigationController和一个UITabBarController。主要的UIVIew(containerView)是我作为子视图添加到应用程序窗口的内容。另外两个是containerView的子视图。

UITabBarController *tabBarController = [(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] tabBarController];
UIView *containerView = [(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] containerView];
UINavigationController *accountsNavigationController = [(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] accountsNavigationController];

CGRect accountsNavigationControllerEndFrame = containerView.frame;
CGRect tabBarControllerEndFrame = CGRectMake(containerView.frame.size.width, containerView.frame.origin.y, containerView.frame.size.width, containerView.frame.size.height);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
tabBarController.view.frame = tabBarControllerEndFrame;
accountsNavigationController.view.frame = accountsNavigationControllerEndFrame;
[UIView commitAnimations];