UINavigationBar用动画改变Tint颜色

时间:2011-02-18 14:09:51

标签: iphone uinavigationcontroller uinavigationbar tint tintcolor

是否可以通过动画更改色调以获得更平滑的效果?

这对我不起作用:

[UIView beginAnimations:nil context:nil];
[self.navigationController.navigationBar setTintColor:[UIColor greenColor]];
[UIView commitAnimations];

我不确定是否可以使用原生苹果组件,因为我猜他们将使用CG生成渐变...只是想在我开始构建自己的解决方案之前找出...

干杯们:)

3 个答案:

答案 0 :(得分:26)

你不会相信我经历的那段时间才能真正实现这一目标;让我感到恼火的是,这不是一个iOS版本的功能,而且tintColor的转换看起来很难看,而推动/弹出一个viewController的动画是如此流畅。

有许多代码在淡出时检查,我甚至编写了一个名为PSPDFNavigationAppearanceSnapshot的类来保存弹出时的导航状态。 (我从令人敬畏的NimbusKit

中得到了这个想法

实际动画非常简单:

[self.navigationController.navigationBar.layer addAnimation:PSPDFFadeTransition() forKey:nil];

CATransition *PSPDFFadeTransition(void) {
    return PSPDFFadeTransitionWithDuration(0.25f);
}

CATransition *PSPDFFadeTransitionWithDuration(CGFloat duration) {
    CATransition *transition = [CATransition animation];
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionFade;
    transition.duration = duration;
    return transition;
}

您可以进一步压缩该代码;它是从我的iOS PDF库PSPDFKit中剪下来的,我在各个地方使用淡入淡出,因此帮助函数。

答案 1 :(得分:4)

您无法为条形色彩设置动画 - 可以通过这种方式设置动画的属性列表(对于UIView)为here

我认为你根本不能这样做,除非你想用一个背景颜色正在变化的UIView叠加一个具有中性色调的条。 backgroundColor是可以设置动画的属性之一。但如果您想在导航栏上放置UIView,我可能不得不偷偷摸摸,我不知道如何做到这一点。

另一个想法 - 在drawRect中自己进行子类化和绘图?

答案 2 :(得分:4)

我们在另一个帖子中找到了解决方案:Transition Color navBar

解决方案是为attribut barTinTColor制作动画。这是代码:

 self.navigationController.navigationBar.barTintColor = [UIColor redColor];
 [UIView animateWithDuration:5.0f animations:^{
    self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
} completion:^(BOOL finished) {
}];