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的默认导航。