如何在 iOS7 上更改没有动画的 barTintColor?

Posted

技术标签:

【中文标题】如何在 iOS7 上更改没有动画的 barTintColor?【英文标题】:How to changing barTintColor without animation on iOS7? 【发布时间】:2014-01-10 10:14:32 【问题描述】:

ios7上,我们可以通过改变导航栏的颜色

self.navigationController.navigationBar.barTintColor = [UIColor redColor];

但是这个方法在改变barTintColor的时候有一个淡入淡出的动画,那么有没有人知道如何阻止这个动画并立即改变颜色呢?

更具体地说,我编写了一个测试程序,其窗口的根控制器是navigationController。在 navigationController 中,有一个带有 3 个按钮的视图控制器。 3 个按钮都绑定到以下操作:

- (void)onClick:(id)sender

    UIColor *color = nil;
    if (sender == self.redButton)
    
        color = [UIColor redColor];
    
    else if (sender == self.blueButton)
    
        color = [UIColor blueColor];
    
    else if (sender == self.blackButton)
    
        color = [UIColor blackColor];
    

    self.navigationController.navigationBar.barTintColor = color

//    [UIView animateWithDuration:0 animations:^
//        self.navigationController.navigationBar.barTintColor = color;
//    ];

//    [CATransaction begin];
//    [CATransaction setDisableActions:YES];
//    self.navigationController.navigationBar.barTintColor = color;
//    [CATransaction commit];


将动画持续时间更改为 0 或使用[CATransaction setDisableActions:YES] 都不起作用,动画仍然存在。

希望有人能帮忙,谢谢!

【问题讨论】:

【参考方案1】:

在重新设置之前尝试将 barTintColor 设置为 nil。

self.navigationController.navigationBar.barTintColor = nil;
self.navigationController.navigationBar.barTintColor = color;

我遇到了类似的问题,它为我解决了这个问题。希望对您有所帮助。

【讨论】:

这是唯一对我有用的解决方案。我的导航栏会根据手势从一种颜色渐变为另一种颜色,效果很好。谢谢【参考方案2】:

您需要禁用隐式动画。你可以这样做:

[CATransaction begin];
[CATransaction setDisableActions: YES];

self.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:125.0/255.0 green:90.0/255.0 blue:146.0/255.0 alpha:1];

[CATransaction commit];

此技术适用于任何隐式动画。隐式动画是 iOS 在您更改可动画属性时为您创建的动画。请参阅此处了解更多信息:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html

【讨论】:

抱歉,您在 navigationBar.barTintColor 上试过了吗?它只是不起作用。 在 UITabBarController.tabBar.barTintColor 上对我不起作用。【参考方案3】:

UINavigationBar 上的translucent 属性设置为NO,然后在更改条形色调后将其重置

self.navigationBar.translucent = NO;
self.navigationBar.barTintColor = [UIColor magentaColor];
self.navigationBar.translucent = YES;

【讨论】:

这是该线程中唯一对我有用的方法。谢谢。【参考方案4】:

试试

[UIView animateWithDuration:0 animations:^
        self.navigationController.navigationBar.barTintColor = [UIColor redColor];
];

【讨论】:

你运行了这段代码吗?动画仍然存在,动画时长没有改变。

以上是关于如何在 iOS7 上更改没有动画的 barTintColor?的主要内容,如果未能解决你的问题,请参考以下文章

防止 iOS 7 UINavigationBar 使用 UIAppearance 为 barTintColor 更改设置动画

更改 NavigationItem 提示时出现奇怪的动画

在 iOS7 上更改 UISwitch 的 onTintColor?

如果父视图正在动画,则 IOS7 子视图会被动画

UIViewController presentViewController modal在iOS7中没有动画

UISlider在iOS7中没有动画