8

我使用以下代码作为扩展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.

在禁用缓存的情况下,由于其速度,此动画不可见,但帧速率显着下降。

如何防止标题被动画化?

4

3 回答 3

0

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

于 2012-06-01T02:33:55.427 回答
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];

和推动同样的事情。

**确保#import <QuartzCore/QuartzCore.h> 在您的课程中,并将框架添加到您的项目中

target > Build Phases > Link Binary With Libraries > “+”按钮 > QuartzCore.framework

.**

于 2012-06-06T13:20:40.353 回答
0

只是一个快速更新我的修复到底是什么。无法覆盖 的默认行为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];

于 2012-07-22T14:11:02.737 回答