现在的位置: 首页 > 综合 > 正文

ios设置导航栏背景图片、返回按钮背景、标题颜色等等

2013年04月24日 ⁄ 综合 ⁄ 共 4539字 ⁄ 字号 评论关闭

  在ios程序的编写过程中,很多时候我们都要自定义自己的UI,而不是使用cocoatouch中原有的。说起对UI的更改,很多时候我们只是修改一下原有UI的背景啊,颜色之类的,以达到新的要求。
    在此之前呢,设置UINavigationController的背景颜色,我会使用如下的代码:
首先看.h文件

[plain] view
plain
copy

  1. #import <UIKit/UIKit.h>  
  2. @interface UINavigationBar (CustomBar)  
  3. - (void)customNavigationBar;  
  4. @end  

.m文件

[plain] view
plain
copy

  1. #import "UINavigationBar+CustomBar.h"  
  2. #import <QuartzCore/QuartzCore.h>  
  3. @implementation UINavigationBar (CustomBar)  
  4. - (void)customNavigationBar  
  5. {  
  6.     if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])  
  7.     {  
  8.         CGSize titleSize = self.bounds.size;  //获取Navigation Bar的位置和大小  
  9.         UIImage *image = [UIImage imageNamed:@"img_nav_backimg"];  
  10.           
  11.         UIGraphicsBeginImageContext(titleSize);  
  12.         [image drawInRect:CGRectMake(0, 0, titleSize.width, titleSize.height)];  
  13.         UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();  
  14.         UIGraphicsEndImageContext();  
  15.         [self setBackgroundImage:scaledImage forBarMetrics:UIBarMetricsDefault];  
  16.     }  
  17.     else  
  18.     {  
  19.         [self drawRect:self.bounds];  
  20.     }  
  21.       
  22. //    [self drawRoundCornerAndShadow];  
  23. }  
  24.   
  25. - (void)drawRect:(CGRect)rect {  
  26.     [[UIImage imageNamed:@"img_nav_backimg.png"] drawInRect:rect];  
  27. }  
  28.   
  29. - (void)drawRoundCornerAndShadow {  
  30.     CGRect bounds = self.bounds;  
  31.     bounds.size.height +=10;  
  32.     UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds  
  33.                                                    byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)  
  34.                                                          cornerRadii:CGSizeMake(10.0, 10.0)];  
  35.       
  36.     CAShapeLayer *maskLayer = [CAShapeLayer layer];  
  37.     maskLayer.frame = bounds;  
  38.     maskLayer.path = maskPath.CGPath;  
  39.       
  40.     [self.layer addSublayer:maskLayer];  
  41.     self.layer.mask = maskLayer;  
  42.     self.layer.shadowOffset = CGSizeMake(3, 3);  
  43.     self.layer.shadowOpacity = 0.7;  
  44.     self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;  
  45. }  
  46. @end  

调用时如下:

[plain] view
plain
copy

  1. //设置导航栏底图  
  2. + (void)setNavigationCtrollerBackImg:(UINavigationController *)naviCtl  
  3. {  
  4.     [naviCtl.navigationBar customNavigationBar];  
  5. }  

    这样的写法是一个不错的选择。如果说要修改
self.title的颜色呢,相信很多人都会想到自定义UILabel,然后self.navigationControl.titleView = Label,这针对几个页面也许是一个比较不错的选择,可是如果很多页面,甚至所有的页面都需要呢,你或许会说设置一个基础类,然

后从这个基础类继承过来,这也可以,但是不是最简便的方式。
    好了,说了这么多,我们来看看我最近看到的一个比较方便的方法吧:

[plain] view
plain
copy

  1. <pre name="code" class="plain">#pragma mark 初始化导航栏主题  
  2. - (void)setNavTheme  
  3. {  
  4.     // 1.设置导航栏背景  
  5.     UINavigationBar *bar = [UINavigationBar appearance];  
  6.     [bar setBackgroundImage:[UIImage resizeImage:@"NavigationBar_Background.png"] forBarMetrics:UIBarMetricsDefault];  
  7.     // 状态栏  
  8.     [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackOpaque;  
  9.       
  10.     // 2.设置导航栏文字属性  
  11.     NSMutableDictionary *barAttrs = [NSMutableDictionary dictionary];  
  12.     [barAttrs setObject:[UIColor darkGrayColor] forKey:UITextAttributeTextColor];  
  13.     [barAttrs setObject:[NSValue valueWithUIOffset:UIOffsetMake(0, 0)] forKey:UITextAttributeTextShadowOffset];  
  14.     [bar setTitleTextAttributes:barAttrs];  
  15.       
  16.     // 3.按钮  
  17.     UIBarButtonItem *item = [UIBarButtonItem appearance];  
  18.     [item setBackgroundImage:[UIImage resizeImage:@"BarButtonItem_Normal.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];  
  19.     [item setBackgroundImage:[UIImage resizeImage:@"BarButtonItem_Pressed.png"] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];  
  20.       
  21.     NSMutableDictionary *itemAttrs = [NSMutableDictionary dictionaryWithDictionary:barAttrs];  
  22.     [itemAttrs setObject:[UIFont boldSystemFontOfSize:13] forKey:UITextAttributeFont];  
  23.     [item setTitleTextAttributes:itemAttrs forState:UIControlStateNormal];  
  24.     [item setTitleTextAttributes:itemAttrs forState:UIControlStateHighlighted];  
  25.     [item setTitleTextAttributes:itemAttrs forState:UIControlStateDisabled];  
  26.       
  27.     // 4.返回按钮  
  28.     [item setBackButtonBackgroundImage:[UIImage resizeImage:@"BarButtonItem_Back_Normal.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];  
  29.     [item setBackButtonBackgroundImage:[UIImage resizeImage:@"BarButtonItem_Back_Pressed.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];  
  30.       
  31.     //返回按钮的标题  
  32.     UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] init];  
  33.     barButtonItem.title = @"buttonName";  
  34.     self.navigationItem.backBarButtonItem = barButtonItem;   
  35.     [barButtonItem release]  
  36. }</pre><br><br>  

    这个方法极大的减轻了自定义带来的代码开销,用在换肤方面可能会更好的体现。是不是很不错啊!

抱歉!评论已关闭.