自定义导航栏样式 – iOS

可能重复:
如何在iphone导航栏上添加背景图片?

iOS – 纽约时报是如何做这个自定义顶级导航栏造型?

那么最底层的呢?

谢谢…

NY-倍

编辑:这是过时的; 对于iOS5,@Jenox 下面有更好的答案 。

导航栏的完全自定义样式出奇地困难。 我知道的最好的写法是塞巴斯蒂安·塞利斯的这一个: http : //sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/

这不会覆盖drawRect,并且包含一个很好的解释,为什么这是一件好事。 另外请注意,您不必遵循他的教程。 你可以在这里下载完整的代码: https : //github.com/scelis/ExampleNavBarBackground

@ ludwigschubert的解决scheme不能在iOS 5上工作。也不重写-drawRect:因为它甚至没有被调用。
从iOS 5开始,导航栏由UINavigationBarBackgroundUINavigationItemView 。 还有其他两种方法来实现它的工作。


  1. 插入您的自定义图像视图索引1而不是0.这使得它出现在原生背景图像之上,同时留在button之下。

  2. 利用iOS 5的UIAppearance协议 。 您可以设置所有的背景图像

[[UINavigationBar appearance] setBackgroundImage:myImage forBarMetrics:UIBarMetricsDefault]

或者只是一个导航栏:

[navigationController.navigationBar setBackgroundImage:myImage forBarMetrics:UIBarMetricsDefault]

确保在为纵向和横向开发iPhone应用程序时提供两个图像(UIBarMetricsDefault和UIBarMetricsLandscapePhone)

只要添加@Jenox给出的答案,如果你想同时支持iOS 4.xx和iOS 5.xx设备(即你的DeploymentTarget是4.xx),你必须小心地把呼叫包装到外观代理在运行时检查“外观”select器是否存在。

你可以这样做:

 //Customize the look of the UINavBar for iOS5 devices if ([[UINavigationBar class]respondsToSelector:@selector(appearance)]) { [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"NavigationBar.png"] forBarMetrics:UIBarMetricsDefault]; } 

你也应该离开你可能已经实现的iOS 4.xx解决方法。 如果您已经为iOS 4.xx设备实施了“drawRect”解决方法(如@ludwigschubert所述),则应将其保留在:

 @implementation UINavigationBar (BackgroundImage) //This overridden implementation will patch up the NavBar with a custom Image instead of the title - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end 

这将使NavBar在iOS 4和iOS 5设备中看起来相同。

复制到viewDidLoad。 它会检查iOS 5并使用首选的方法,否则会为iOS版本<5.0的navBar添加子视图。 这将工作,只要您的自定义背景图像没有透明度。

 float version = [[[UIDevice currentDevice] systemVersion] floatValue]; NSLog(@"%f",version); UIImage *backgroundImage = [UIImage imageNamed:@"myBackgroundImage.png"]; if (version >= 5.0) { [self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; } else { [self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:1]; } 

您可以创build一个类别,并创build一个自定义的方法来添加任何你想要的视图 – 图像,button,滑块。 敌人的例子,这里是我使用的代码 – 它添加了自定义的backgroundImage,backButton和Label。

 @interface UINavigationBar (NavigationBar) -(void)setBarForCard; @end @implementation UINavigationBar (NavigationBar) -(void)setBarForCard { UIImageView *aTabBarBackground = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"BarImage"]]; aTabBarBackground.frame = CGRectMake(0,0,self.frame.size.width,44); [self addSubview:aTabBarBackground]; [self sendSubviewToBack:aTabBarBackground]; [aTabBarBackground release]; UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom]; backBtn.frame =CGRectMake(10, 8, 60, 30); [backBtn addTarget:self action:@selector(back:)forControlEvents:UIControlEventTouchUpInside]; [backBtn setImage:[UIImage imageNamed: @"Back"] forState:UIControlStateNormal]; [self addSubview:backBtn]; UILabel *calendar = [[UILabel alloc]init]; calendar.frame = CGRectMake(105, 13, 109, 21); calendar.text = @"Calendar" calendar.textColor = [UIColor whiteColor]; calendar.textAlignment = UITextAlignmentCenter; calendar.shadowColor = [UIColor grayColor]; calendar.shadowOffset = CGSizeMake(0, -1); calendar.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:20]; calendar.backgroundColor = [UIColor clearColor]; [self addSubview:calendar]; } 

然后,在任何视图控制器中,您可以通过调用[self.navigationController.navigationBar setBarForCard];来更改导航[self.navigationController.navigationBar setBarForCard];

这在iOS 4IOS 5中都可以使用

这对于iOS 5来说是一个更好的方法

 if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) { UIImage *image = [UIImage imageNamed:@"navBarImg.png"]; [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; } 

您可以更改导航栏的色调以更改其颜色,还可以在导航栏视图中使用图像。 对于底部栏,我认为他们正在使用一个视图上有三个自定义button。