我使用以下代码作为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
的中心。
禁用缓存后,由于速度不同,此动画不可见,但帧速率显着下降。
如何阻止标题动画?
答案 0 :(得分:0)
问题是您动画整个视图self.view
。 self.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];
之后调用它是很重要的。