2

我正在开发一个导航系统,它向下钻取三个步骤,然后让您使用实际上只是更改该视图的内容的箭头导航内容,因此从技术上讲,navigationcontroller 不会收到任何弹出/推送,因为我尽快就像我做的那样

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 > :)]

4

2 回答 2

3

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

导航栏标题之间​​的淡入淡出相当简单:

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一旦完成,您可能会发现需要从图层中删除。我没有机会完全测试它。

于 2014-12-18T12:23:28.190 回答
1

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

例如:-

[UIView animateWithDuration:0.5
    delay:1.0
    options: UIViewAnimationCurveEaseOut
    animations:^{
        label.frame = labelFrame;
    } 
    completion:^(BOOL finished){
        NSLog(@"Done!");
    }];
于 2012-12-10T20:20:11.110 回答