强制NavigationBar的动画标题

时间:2012-12-10 16:37:10

标签: objective-c ios5 uinavigationcontroller ios6

我正在开发一个向下钻取三个步骤的导航系统,然后让你用箭头导航内容,这些箭头实际上只是改变了该视图的内容,所以从技术上讲,导航控制器没有接收任何弹出/推动,因此我一做一个

self.navigationItem.title = [[[self.symbol valueForKey:@"section_title"] uppercaseString]  stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

标题会改变,因为显而易见的原因并没有动画。

有没有办法强制它动画,好像弹出/推动动作一样? 类似的东西:

self.navigationItem.direction = NavigationDirectionLeft;
self.navigationItem.title = @"Whatevah!";

这样一旦标题改变,它就会使旧标题淡出 在从左到右的过渡中,标题淡入,或 更好的方式新标题在从左到右进入时逐渐消失 从左侧

[仅供参考需要支持5.0之前的ios版本,所以只有5.0> :)]

2 个答案:

答案 0 :(得分:2)

好的,这不是一个完美的解决方案,但可能会给你一个起点:

导航栏标题之间​​的淡入淡出非常简单:

CATransition *fade = [CATransition animation];
fade.type = kCATransitionFade;
fade.duration = 2.0;
[self.navigationController.navigationBar.layer addAnimation: fade forKey: @"fadeText"];
self.navigationItem.title = "new Title";

还有其他类型的"开箱即用"您可以使用过渡来为标题的位置设置动画,例如:

CATransition *push = [CATransition animation];
push.duration = 2.0;
push.type = kCATransitionPush;
push.subtype = kCATransitionFromRight;
[self.navigationController.navigationBar.layer addAnimation: push forKey: @"pushText"];
self.navigationItem.title = "new Title";

这个问题是整个导航栏移动了。要解决此问题,您需要在导航栏的子视图中找到标题标签的图层。此视图层次结构是私有的,因此您不应该将此代码提交到商店,但就像我说的那样......这可能会给您一个起点。

CATransition *fade = [CATransition animation];
fade.type = kCATransitionFade;
fade.duration = 2.0;

CATransition *move = [CATransition animation];
move.duration = 2.0;
move.type = kCATransitionMoveIn;
move.subtype = kCATransitionFromRight;

UILabel * navBarTitleLabel;
for (UIView * view in self.navigationController.navigationBar.subviews) {
    if ([NSStringFromClass(view.class) isEqualToString: @"UINavigationItemView"]) {
        navBarTitleLabel = view.subviews.firstObject;
        break;
    }
}

[navBarTitleLabel.layer addAnimation: fade forKey: @"fadeText"];
[navBarTitleLabel.layer addAnimation: move forKey: @"moveText"];

self.navigationItem.title = newTitle;

您可能会发现,一旦他们完成,您需要removeAllAnimations。我没有机会全力测试它。

答案 1 :(得分:1)

尝试将UIView设为self.navigationItem.titleView,然后创建UILabel并将其添加为标题。当您想要制作动画时,请在此UIView上为此标签设置动画,并添加新的UILabel并为其替换动画以替换它。您可以使用一些基于块的动画。

例如: -

[UIView animateWithDuration:0.5
    delay:1.0
    options: UIViewAnimationCurveEaseOut
    animations:^{
        label.frame = labelFrame;
    } 
    completion:^(BOOL finished){
        NSLog(@"Done!");
    }];