导航栏更改带有动画的色调颜色

7

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

这对我没有用:

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

我不确定是否可以使用原生的苹果组件来实现这个渐变效果,因为我猜他们会使用CG来生成渐变......在开始构建我的解决方案之前,我只是想找出答案......

谢谢大家 :)


如果您看到这篇文章,那么它已经过时了,我们在另一个帖子中找到了解决方案:http://stackoverflow.com/questions/20377628/transition-color/20396308?noredirect=1#20396308 - Pull
3个回答

26
您无法想象我为实现这一点所付出的努力; 这不是iOS的原生功能,而且tintColor的转换看起来很丑陋,而推入/弹出视图控制器的动画却如此流畅,这让我感到非常恼火。
有很多代码检查何时要淡出,我甚至编写了一个名为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
为什么在PSPDFFadeTransitionWithDuration中你有一个持续时间参数,但你从未使用它?我认为你忘记写transition.duration = duration了。 - Luca Bernardi
需要添加这个。 - steipete
当用户从右侧拖动边缘,然后将屏幕向左拖回时,会出现闪烁。有没有办法修复它?取消过渡效果? - Igor Palaguta
1
现在,您可以使用UINavigationControllerHideShowBarDuration来获取动画持续时间,而不是硬编码为0.25f - Alejandro Iván

4
我们在另一个帖子中找到了解决方案:Transition Color navBar 解决方案是通过动画化barTintColor属性来实现的。以下是代码:
 self.navigationController.navigationBar.barTintColor = [UIColor redColor];
 [UIView animateWithDuration:5.0f animations:^{
    self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
} completion:^(BOOL finished) {
}];

5
在iOS 10中停止了动画。 - cvb
只需在完成中添加以下代码即可在iOS 10上运行:[self.navigationController.navigationBar layoutIfNeeded]; - Paul Razvan Berg

4
您无法对条形色调进行动画处理 - 可以以这种方式进行动画处理的属性列表(针对UIView)在此处列出。
我认为除非您想在具有中性色调的栏上覆盖背景颜色正在更改的UIView,否则根本无法做到这一点。 backgroundColor是可以进行动画处理的属性之一。但是,如果您想将UIView放在导航栏顶部,则可能必须行事诡异。我不知道如何做到这一点。
另一个想法-子类化并在drawRect中自己进行绘制?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接