使用自定义动画推送UITableViewController始终为UINavigationItem标题设置动画

时间:2012-05-03 18:31:42

标签: objective-c ios animation uinavigationcontroller uinavigationitem

我使用以下代码作为UINavigationController的扩展来推送具有自定义动画的视图控制器:

@implementation UINavigationController (PushAnimation)

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

@end

启用缓存后,推送UITableViewController时会出现奇怪的动画行为。自定义动画完成后,将显示推送视图的标题。使用过渡样式UIViewAnimationTransitionNone,很明显标题本身是动画的。它从屏幕的左上角移动到UINavigationBar的中心。

禁用缓存后,由于速度不同,此动画不可见,但帧速率显着下降。

如何阻止标题动画?

3 个答案:

答案 0 :(得分:0)

问题是您动画整个视图self.viewself.view包含视图控制器以及UINavigationBar。因此,您可能必须获取self.view的所有子视图,然后仅设置与视图控制器相关的view动画。

答案 1 :(得分:0)

使用此代码以非常直接的方式自定义导航过渡动画:

CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionMoveIn; //kCATransitionPush; //kCATransitionReveal; //kCATransitionFade; 
//transition.subtype = kCATransitionFromRight; //transition.subtype = kCATransitionFromLeft; //transition.subtype = kCATransitionFromTop; //transition.subtype = kCATransitionFromBottom;
transition.subtype = kCATransitionFromRight;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[[self navigationController] popViewControllerAnimated:NO];

和push一样。

**确保班级#import <QuartzCore/QuartzCore.h> ,并将框架添加到项目中

  

目标&gt;构建阶段&gt; Link Binary with Libraries&gt; “+”按钮&gt;   QuartzCore.framework

。**

答案 2 :(得分:0)

快速更新我的修复程序到底是什么。由于iOS使用私有API来实现动画,因此无法覆盖UINavigationBar的默认行为。所以我最终删除了UINavigationBar上的所有动画及其各种子视图,使用以下代码:

[self.navigationBar.layer removeAllAnimations];
for (UIView *view in self.navigationBar.subviews) {
    [view.layer removeAllAnimations];
    for (UIView *sub in view.subviews) {
        [sub.layer removeAllAnimations];
    }
}

[self pushViewController:controller animated:NO];之后调用它是很重要的。