自定义导航栏

我正在抓取运球,发现附带的devise。 我想知道如何做这样的自定义导航栏。 我的意思是如何创build一次导航栏,并隐式重复使用它为每个视图控制器。

我想有一种根视图控制器,并inheritance其他视图控制器,但我不知道如何做到这一点。

任何想法或链接将appreachated!

干杯。

西里尔

导航栏图像

感谢iOS5,您现在可以自定义UINavigationBar的外观,而无需创build子类或创build类别。

下面的代码块(把它放在你的applicationDidFinishLoading:方法中)将把整个应用程序的UINavigationBar更改为你给它的任何图像。

请注意,这只会在iOS5中工作

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav bar.png"] forBarMetrics:UIBarMetricsDefault];

不过,您也可以通过在viewDidLoad中使用以下代码,根据您所处的视图控制器来更改单个UINavigationBar的外观。

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav bar.png"] forBarMetrics:UIBarMetricsDefault];

上面的代码仅仅是讨论了iOS5自定义UINavigationBar外观的新方法。 但是,它没有讨论button的实现方式。

但是,添加button是完全不同的游戏。 为此,我build议UINavigationBar ,然后在需要的地方添加button。 你可能甚至可以逃脱一个标准的UINavigationBar但是自定义的UIBarButtonItem运行一个特定的视图。

例如:

 UIView *rightButton = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 30.0f, 30.0f)] autorelease]; [rightButton addSubview:[UIImage imageNamed:@"rightButtonImage.png"]]; UIBarButtonItem *rightButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:rightButton] autorelease]; [rightButtonItem setAction:@selector(rightButtonAction:)]; 

我没有testing过这个代码,所以它不是一个复制/粘贴的解决scheme,但是它给了你一个完成“自定义”UIBarButtonItems所需要做的事情的想法。

祝你好运!

在较旧的iOS版本中,您必须inheritanceUINavigationBar,即:

 @interface CustomNavigationBar : UINavigationBar @end @implementation CustomNavigationBar - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { self.opaque = YES; self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"CustomBackground"]]; } return self; } - (void)drawRect:(CGRect)rect { // Skip standard bar drawing } @end 

要在视图控制器中使用自定义导航栏,应该将标准类名更改为XIB中的CustomNavigationBar。

此外,您可以以编程方式设置自定义导航栏:

 UIViewController *tempController = [[[UIViewController alloc] init] autorelease]; UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:tempController] autorelease]; NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:navigationController]; NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:archive] autorelease]; [unarchiver setClass:[CustomNavigationBar class] forClassName:@"UINavigationBar"]; UINavigationController *customNavigationController = [unarchiver decodeObjectForKey:@"root"]; UIViewController *contentController = [[[ContentViewController alloc] init] autorelease]; customNavigationController.viewControllers = [NSArray arrayWithObject:contentController]; 

现在customNavigationController具有自定义导航栏。

为NavigationBar设置一个自定义的背景

 UIImage *navBackground =[[UIImage imageNamed:@"navbarBackground"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; [[UINavigationBar appearance] setBackgroundImage:navBackground forBarMetrics:UIBarMetricsDefault]; 

然后在您的视图控制器为左,右巴巴顿和标题设置自定义视图。

 self.navigationItem.titleView = customTitleView; self.navigationItem.leftBarButtonItem = customBarButton; self.navigationItem.rightBarButtonItem = customBarButton2; 

您需要制作自己的UINavigationBar子类,并在需要导航UINavigationBar地方使用。

在这个自定义类中,您将绘制背景,button,文本等


更新

其实,仔细看看这个例子,看起来是一个UIToolBar 。 您可以将导航方法分配给popViewController:等buttonpopViewController:对于“确认信息”和进度指示器,您可以使用标签和图像。 对于右键,它只是一个graphics。

当然,你提供的例子只是一个概念,而不是一个真正的应用程序。 但是有了一些创意,几个小时的编码和几个小时的graphicsdevise,你可以实现这个相同的接口。

使用Category ,在代理文件(.m)中添加以下代码

 @implementation UINavigationBar (UINavigationBarCategory) - (void)drawRect:(CGRect)rect { UIImage *navBg = [UIImage imageNamed:@"NavBar.png"]; [navBg drawInRect:CGRectMake(0, 0, 320, 44)]; } @end 

编辑:

使用Category不是一个好方法,我写了一个没有使用Category的演示,请点击这里 。

您可以使用库存UINavigationController并隐藏UINavigationBar。

然后,制作你自己的具有所有导航元素的UIViewController的子类,然后在内容所在的位置放置一个flexing size视图。 使所有的类都inheritance这个元素并绘制到视图中。 该button只需调用[self.navigationController popViewControllerAnimated:YES] ,在视图的UILabel只需要将其文本设置为self.title