如果已经自定义,如何覆盖UINavigationBar外观

时间:2012-01-17 19:13:54

标签: ios ios5 uinavigationbar styling appearance

在我的应用程序中的应用程序委托中,我调用以下方法:

- (void)customizeAppearance 
{
    UIImage *gradientPortrait = [[UIImage imageNamed:@"gradient_portrait"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

    UIImage *gradientLandscape = [[UIImage imageNamed:@"gradient_landscape"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

    [[UINavigationBar appearance] setBackgroundImage:gradientPortrait 
        forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:gradientLandscape 
        forBarMetrics:UIBarMetricsLandscapePhone];
}

此代码允许自定义应用程序中的所有导航栏。由于我使用的图像是绿色,因此每个条形变为绿色。

现在我的目标是为特定的导航栏提供上述配置。 特别是,在应用程序生命周期中,我使用UIModalPresentationFormSheet表示样式打开模态控制器。此控制器显示在UINavigationController内。由于我还需要显示附加了UINavigationController的导航栏,我想知道如何自定义该栏,而不更改我在应用程序委托中设置的全局配置。

我尝试将导航栏的tintColor属性(以模态方式呈现)设置为[UIColor blackColor],将barStyle设置为UIBarStyleBlack,但它们不会工作。只有barbutton项目会受到影响。

提前谢谢。

P.S。我正在使用iOS 5

2 个答案:

答案 0 :(得分:4)

首先,如果您不介意拉伸图像,则不需要使用resizableImageWithCapInsets:UIEdgeInsetsMake(0,0,0,0)方法。

UIImage *gradientPortrait = [UIImage imageNamed:@"gradient_portrait"];
UIImage *gradientLandscape = [UIImage imageNamed:@"gradient_landscape"];

UIImage *someOtherImage = [UIImage imageNamed:@"someOtherImageName"];

然后,为了实现你想要的目标:

  1. 确保将ViewController创建为子类,并显示自定义导航栏
  2. 使用以下内容将默认图像添加到所有导航栏

    [[UINavigationBar appearance] setBackgroundImage:gradientPortrait forBarMetrics:UIBarMetricsDefault];
    
  3. 使用以下内容将特定图像添加到将显示在子类ViewControllers上方的导航栏

    [[UINavigationBar appearanceWhenContainedIn:[YOURSUBCLASS class], nil] setBackgroundImage:someOtherImage forBarMetrics:UIBarMetricsDefault];
    
  4. (您可以从应用代理中的某个位置调用这些方法)

    顺便说一下,如果您只想更改色调颜色,可以使用tintColor属性而不是所有图像。

    了解更多信息,请查看:UINavigationBar Class Reference

    的外观部分

答案 1 :(得分:0)

使用您的自定义类对UINavigationBar进行子类化,并在其上显示不同的外观。然后在特定的地方使用您的自定义类,在那里您可以看到不同的外观。