为了以编程方式更改barTint颜色,我创建了自己的UINavigationBar类,该类扩展了UINavigationBar。在那里,我重写了setBarTintColor方法以更改颜色。在iOS 7.1中,从未调用此方法,因此我现在从“awakeFromNib”方法手动调用它,但我认为这是问题开始的地方。

我使用此自定义类重写以下外观设置:

[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithWhite:0.302 alpha:1.000]];

在我的自定义类中使用此方法:
- (void)setBarTintColor:(UIColor *)barTintColor
{
    UIDevice *device = [UIDevice currentDevice];
    if(![NachtModusController NachtModus])
    {
        if (device.platformType == UIDevice4iPhone || device.platformType == UIDevice4SiPhone)
        {
            [super setBarTintColor:[UIColor colorWithWhite:1.000 alpha:1.000]];
        }
        else
        {
            [super setBarTintColor:[UIColor colorWithWhite:1.000 alpha:0.800]];
        }
    }
    else
    {
        //Nachtmodus.
        if (device.platformType == UIDevice4iPhone || device.platformType == UIDevice4SiPhone)
        {
            [super setBarTintColor:[UIColor colorWithWhite:0.302 alpha:1.000]];
        }
        else
        {
            [super setBarTintColor:[UIColor colorWithWhite:0.302 alpha:0.900]];
        }

    }
}

我发现:
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics

在7.1中没有被调用,但是:
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarPosition:(UIBarPosition)barPosition barMetrics:(UIBarMetrics)barMetrics

是的。

如何使用自定义类覆盖setBarTintColor外观设置?

我的解决方案:

看起来像这样设置图像:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navbar"] forBarMetrics:UIBarMetricsDefault];

并像这样重置它:
[[UINavigationBar appearance] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

在iOS7.1中也引起一些副作用(与7.0有所不同)

我删除了背景图片,只使用了barTint颜色,该颜色随外观选项更改并更改了当前颜色(self.navigationController.navigationbar)。

我删除了自定义类。

最佳答案

您不应覆盖setBarTintColor:来更改barTintColor。在您的情况下,您“破坏”了setBarTintColor:方法的功能,因为它忽略了输入参数。此外,只要您不调用NavigationBar函数,您的setBarTintColor:就不会改变您想要的颜色。
创建导航栏时,应将此代码移动到被调用的位置。创建NavigationBar后,可以从外部调用它,也可以覆盖NavigationBar类中的初始化方法。

08-27 19:10