2010-07-14 74 views
16

我有一个iPhone应用程序使用UINavigationController并希望自定义背景图像的元素。我能为UINavigationController'sUINavigationBar很容易地做到这一点使用下面的Objective-C类:自定义UINavigationController UIToolbar背景图片

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

我想要做的UINavigationController'sUIToolbar相同,但相同的方法似乎并不(尽管我完全不知道为什么)。我环顾四周,人们似乎建议子类UIToolbar,但这不可能用于UINavigationController's工具栏,该工具栏是只读的UIToolbar。我想使用UINavigationController's工具栏,而不是仅制作子视图工具栏,因为我正在使用幻灯片setToolbarHidden动画。

任何人有任何想法,如果它可以应用背景图像此UINavigationController工具栏(最有可能通过某种方式覆盖drawRect方法)?

回答

9

您需要子类而不是创建类别。

我不太确定为什么一个类别适用于UINavigationBar而不是UIToolbar,但子类别适用于他们两个,我认为这是定制类似东西的更为标准的方式。

所以子类UIToolbar,创建一个名为MyToolbar(或类似的东西)类,并把这个在.H:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@interface MyToolbar : UIToolbar {} 

- (void)drawRect:(CGRect)rect; 

@end 

这在.m文件:

#import "MyToolbar.h" 

@implementation MyToolbar 

- (void)drawRect:(CGRect)rect { 
    backgroundImage = [UIImage imageNamed:@"my-awesome-toolbar-image.png"]; 
    [backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end 

从那里你必须告诉导航控制器使用MyToolbar而不是UIToolbar。我发现最简单的方法是在界面生成器中选择你的导航控制器,然后在属性检查器中选中“显示工具栏”框。工具栏应显示在NavigationController窗口中。点击它,然后在Identity Inspector中将类更改为MyToolbar

+3

太棒了!谢谢。你(或其他人)是否知道以编程方式完成最后一步的方法?我没有使用Interface Builder设置我的导航控制器。 – Chris 2010-07-24 05:23:14

+2

@Chris,我也想知道如何以编程方式覆盖工具栏。谢谢! – pixelfreak 2011-09-15 23:57:03

+1

任何人都发现了如何以编程方式完成最后一步? – Panos 2012-07-09 13:03:43

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

不幸的是,这会自定义导航栏而不是工具栏。 – 2011-04-26 11:41:18

+0

哇,好点。我完全错过了这个标志。仍然是一个很好的解决方案,但导航栏虽然:) – Maurizio 2011-04-27 18:58:27

+0

我添加了两个文件到我的代码,UINavigationBar.h和UINavigationBar.m并将这些代码添加到他们。我也尝试过使用文件名JHNavigationBar.h/.m。它不会自动应用于我。我错过了什么? – joshholat 2011-11-19 18:53:49

2

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

唯一的一点是,你需要调用next方法在你的viewDidLoad例如:所以

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

,为iOS类范畴4.0和iOS 5.0兼容性自定义BackgroundImage结果如下:

@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 

迎接!

0

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

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

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