Objective c 推送带有自定义动画的UITableViewController始终为UINavigationItem标题设置动画

Objective c 推送带有自定义动画的UITableViewController始终为UINavigationItem标题设置动画,objective-c,ios,animation,uinavigationcontroller,uinavigationitem,Objective C,Ios,Animation,Uinavigationcontroller,Uinavigationitem,我使用以下代码作为UINavigationController的扩展,以使用自定义动画推送视图控制器: @implementation UINavigationController (PushAnimation) - (void)pushViewController:(UIViewController*)controller withTransition:(UIViewAnimationTransition)transition { [UIView beginAnimations:n

我使用以下代码作为
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
的中心

禁用缓存后,此动画因其速度而不可见,但帧速率会显著下降


如何防止标题被设置动画?

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

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

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];
推也一样

**确保
#导入
,并将框架添加到项目中

目标>构建阶段>将二进制文件链接到库>“+”按钮> QuartzCore.framework


.*

只需快速更新我的最终解决方案。无法覆盖
UINavigationBar
的默认行为,因为iOS使用私有API来实现动画。因此,我最终使用以下代码删除了
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]之后调用此函数非常重要

我认为标题的动画发生在
UINavigationBar
代码中。一个想法是将其子类化,并更改其默认行为。好吧,我也想为导航栏设置动画,因为我想更改整个屏幕,而不仅仅是UINavigationBar下面的内容。问题是,我似乎无法禁用UINavigationbar的默认导航。