自定义导航栏
我正在抓取运球,发现附带的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
。