自定义UINavigationController UIToolbar背景图片

时间:2010-07-14 08:01:33

标签: objective-c cocoa-touch uinavigationcontroller uitoolbar

我有一个使用UINavigationController的iPhone应用程序,并希望使用自定义背景图像自定义元素。我能够很容易地使用Objective-C类别为UINavigationController's UINavigationBar执行此操作,如下所示:

http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html

我想对UINavigationController's UIToolbar做同样的事情,但同样的方法似乎不起作用(虽然我完全不知道为什么不这样做。)我环顾四周并且人们似乎建议继承UIToolbar,但这对于UINavigationController's工具栏是不可能的,UIToolbar工具栏是只读的UINavigationController's。我想使用setToolbarHidden工具栏而不是仅创建子视图工具栏,因为我正在使用滑入式UINavigationController动画。

任何人都知道是否可以将背景图片应用于此drawRect工具栏(最有可能以某种方式覆盖{{1}}方法)?

4 个答案:

答案 0 :(得分:10)

<强>更新

在iOS 5.0+中,您现在可以使用UIAppearance自定义导航栏。


另一种方法是简单地为应用程序的UINavigationBar类创建一个类别。这非常简单易用:

<强>接口

@interface UINavigationBar (TENavigationBar)

- (void) drawRect:(CGRect)rect;

@end

<强>实施

@implementation UINavigationBar (TENavigationBar)

- (void) drawRect:(CGRect)rect
{
    UIImage *image = [UIImage imageNamed:@"navigation_background"];

    [image drawInRect:CGRectMake(0, 
                                 0, 
                                 self.frame.size.width, 
                                 self.frame.size.height)];
}

@end

然后,这将全局自动应用于您的所有UINavigationBar

答案 1 :(得分:9)

答案 2 :(得分:2)

最好的解决方案之一是创建一个UINavigationBar和UIToolbar类别。接下来的课程为您提供了iOS 4.0和iOS 5.0兼容性的解决方案:

唯一需要调用viewDidLoad中的下一个方法,例如:

// Customizacion de navigation bar y toolbar compatible con iOS4 e iOS5
[UINavigationBar iOS5UINavigationBarBackgroundImage];
[UIToolbar iOS5UIToolbarBackgroundImage];    

因此,用于自定义BackgroundImage的iOS 4.0和iOS 5.0兼容类类别如下:

@implementation UINavigationBar (BackgroundImage)
- (void)drawRect:(CGRect)rect 
{    
    UIImage* img = [UIImage imageNamed: @"navigation-bg.png"];
    [img drawInRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  
    [self setTintColor:UIColorFromRGB(0x5ca666)];      
}
+ (void) iOS5UINavigationBarBackgroundImage
{
    if ([UINavigationBar respondsToSelector: @selector(appearance)])
    {
        [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"navigation-bg.png"] forBarMetrics: UIBarMetricsDefault];
        [[UINavigationBar appearance] setTintColor:UIColorFromRGB(0x5ca666)];
    }
}
@end

@implementation UIToolbar (BackgroundImage)
- (void)drawRect:(CGRect)rect 
{
    UIImage *image = [UIImage imageNamed: @"toolbar-bg.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    [self setTintColor:UIColorFromRGB(0x5ca666)];
}
+ (void) iOS5UIToolbarBackgroundImage
{
    if ([UIToolbar respondsToSelector: @selector(appearance)])
    {
        [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed: @"toolbar-bg.png"] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
        [[UIToolbar appearance] setTintColor:UIColorFromRGB(0x5ca666)];
    }
}
@end

电贺!

答案 3 :(得分:0)

一个简单的选择是子类化UINavigationBar / UIToolbar并使用以下方法初始化导航控制器:

- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass

但是,对于简单的自定义(如背景图像,阴影等),我建议使用UIAppearance协议模式。