UINavigationbar的背景修改方法集合


最近我突然發現UINavigationbar背景修改的方法不起作用了,代碼如下:

1
2
3
4
5
6
7
8
9
@implementation UINavigationBar (CustomImage)

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

@end

發現原來是iOS 5的原因,如果運行在iOS 5以下的版本就沒有問題了。經過實驗以下方法適合iOS 5(放在ViewDidLoad中):

1
2
3
    if ([self.navigationController.navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)]){
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbar.png"] forBarMetrics:UIBarMetricsDefault];
    }

第一條if語句的作用是防止程序在iOS 5以下的版本中崩潰。

這樣,依靠這兩段代碼,我的UINavigationbar的背景問題在iOS 5及以下版本中得到了完美的解決。


 

iOS5之前是如何自定義UINavigationBar背景的?

在iOS5.0中我們可以非常簡單的設置UINavigationBar的背景(setBackgroundImage: forBarMetrics:方法),而這對於之前的版本是不可同日而語的。通過網絡收集整理了一下以前的各種方式,只能作爲學習筆記做個記錄,菜鳥學習而已。高人就跳過吧。
方法一:主要技巧就是用視圖的drawInRect:方法繪製
如下爲創建了一個UINavigationBar Category

// 其實現代碼如下
@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
//顏色填充
UIColor *color = [UIColor redColor];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColor(context,CGColorGetComponents([color CGColor]));
CGContextFillRect(context,rect);
self.tintColor = color;

//圖片填充
UIColor *color = [UIColor colorWithRed:46.0f/255.0f green:87.0f/255.0f blue:29.0f/255.0f alpha:1.0f];
UIImage *img = [UIImage imageNamed:@"bg.png"];
[img drawInRect:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)];
self.tintColor = color;
}
@end

自定義圖片背景以下兩句代碼是關鍵:
UIImage *img = [UIImage imageNamed:@"bg.png"];

[img drawInRect:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)];
或者:
UIImage *img = [UIImage imageNamed:@"bg.png"];
CGPoint point = {0,0};
[img drawAtPoint:point];
或者:

//加入旋轉座標系代碼

 

// Drawing code

 

UIImage *navBarImage = [UIImage imageNamed:@"LOGO_320×44.png"];

 

CGContextRef context = UIGraphicsGetCurrentContext();

 

CGContextTranslateCTM(context, 0.0, self.frame.size.height);

 

CGContextScaleCTM(context, 1.0, -1.0);

 

CGPoint center=self.center;

 

CGImageRef cgImage= CGImageCreateWithImageInRect(navBarImage.CGImage,CGRectMake(0, 0, 1, 44));

 

CGContextDrawImage(context, CGRectMake(center.x-160-80, 0, 80,self.frame.size.height), cgImage);

 

CGContextDrawImage(context, CGRectMake(center.x-160, 0, 320,self.frame.size.height), navBarImage.CGImage);

 

CGContextDrawImage(context, CGRectMake(center.x+160, 0, 80,self.frame.size.height), cgImage);
擴展UINavigationBar的drawRect方法的這種自定義方法會影響到工程項目中所有的導航條欄。
類似在iOS5.0中,由於UINavigationBar、UIToolBar和UITabBar的實現方式改變,而drawRect:方法不會被調用了,所以就不支持這種通過定義導航條類別的方式來自定義導航條了。除非在這類控件的子類中實現

//子類可以調用drawRect:方法
@interface MyNavigationBar : UINavigationBar
@end
@implementation MyNavigationBar
- (void)drawRect:(CGRect)rect {
  [super drawRect:rect];
}
@end

方法二:定義UINavigationBar的一個static函數

 1 + (UINavigationBar *)createNavigationBarWithBackgroundImage:(UIImage *)backgroundImage title:(NSString *)title {
2 UINavigationBar *customNavigationBar = [[[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
3 UIImageView *navigationBarBackgroundImageView = [[UIImageView alloc] initWithImage:backgroundImage];
4 [customNavigationBar addSubview:navigationBarBackgroundImageView];
5 UINavigationItem *navigationTitle = [[UINavigationItem alloc] initWithTitle:title];
6 [customNavigationBar pushNavigationItem:navigationTitle animated:NO];
7 [navigationTitle release];
8 [navigationBarBackgroundImageView release];
9 return customNavigationBar;
10 }

下面是在需要生成UINavgationBar 的地方添加的代碼     *ViewController.m:

View Code
 1 self.navigationController.navigationBar.hidden = YES;
2 UIImage *navigationBarBackgroundImage =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"topbar-bg" ofType:@"png"]];
3 UINavigationBar *customNavigationBar = [YOUR_Util_Class createNavigationBarWithBackgroundImage:navigationBarBackgroundImage title:nil];
4 [self.view addSubview:customNavigationBar];
5
6 UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 75.0, 30.0)];
7 if (_backButtonImage) {
8 [backButton setImage:_backButtonImage forState:UIControlStateNormal];
9 }else {
10 [backButton setImage:[UIImage imageNamed:@"btnback.png"] forState:UIControlStateNormal];
11 }
12
13 [backButton addTarget:self action:@selector(backButtonCliked:) forControlEvents:UIControlEventTouchUpInside];
14 UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];
15 customNavigationBar.topItem.leftBarButtonItem = backBarButton;
16
17 [backButton release];
18 [backBarButton release];
19
20 UIButton *addButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 43, 30)];
21 UIBarButtonItem *addBarButton = [[UIBarButtonItem alloc] initWithCustomView:addButton];
22 if (_isFromFavorites) {
23 [addButton setImage:[UIImage imageNamed:@"btn-delete-0.png"] forState:UIControlStateNormal];
24 [addButton addTarget:self action:@selector(deleteButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
25 }else {
26 [addButton setImage:[UIImage imageNamed:@"btn_add.png"] forState:UIControlStateNormal];
27 [addButton addTarget:self action:@selector(addButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
28 }
29 customNavigationBar.topItem.rightBarButtonItem = addBarButton;
30 [addButton release];
31 [addBarButton release];

此代碼效果圖如下:


這一方法轉載自:http://www.cnblogs.com/moshengren/archive/2010/10/18/1855191.html

方法三:也是自定義導航條類別,但是重寫setBackgroundImage:方法
CustomNavController.h

 1 //  Created by suruiqiang on 8/3/10.
2 // Copyright 2010 __MyCompanyName__. All rights reserved.
3 //
4 #pragma once
5 #import <UIKit/UIKit.h>
6 @interface UINavigationBar (UINavigationBarCategory)
7 UIImageView *bg;
8 -(UINavigationBar*)setBackgroundImage:(UIImage*)image;
9 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
10 @end

CustomNavController.m

 1 #import "CustomerNavBarController.h"
2
3 @implementation UINavigationBar (UINavigationBarCategory)
4 -(UINavigationBar*)setBackgroundImage:(UIImage*)image
5 {
6 UINavigationBar *NavBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
7 if(image == nil) return NavBar;
8 bg = [[UIImageView alloc]initWithImage:image];
9 bg.frame = CGRectMake(0.f, 0.f, self.frame.size.width, self.frame.size.height);
10 [NavBar addSubview:bg];
11 [NavBar sendSubviewToBack:bg];
12 [bg release];
13 return NavBar;
14 }
15
16 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index
17 {
18 [super insertSubview:view atIndex:index];
19 [self sendSubviewToBack:bg];
20 }
21 @end

調用代碼示例:

- (void)viewDidLoad {
[super viewDidLoad];
[[self.navigationController navigationBar] setBackgroundImage:[UIImage imageNamed:@"NavigationBarBackground.png"]];

//在下面添加你自己的功能代碼
***********
}

此方法轉載自:http://www.cnblogs.com/moshengren/archive/2010/10/18/1855202.html

方法四:通過導入QuartzCore框架繪製CALayer層來自定義

#import <QuartzCore/QuartzCore.h>

@interface DDNavigationViewController : UINavigationController<UINavigationControllerDelegate> {

CALayer *_barBackLayer;

}

@end

 

View Code
 1 @implementation DDNavigationViewController
2
3 - (id)initWithRootViewController:(UIViewController *)rootViewController {
4
5 self = [super initWithRootViewController:rootViewController];
6
7 self.delegate = self;
8
9 return self;
10
11 }
12
13 - (void)loadView {
14
15 [super loadView];
16
17 UINavigationBar *bar = self.navigationBar;
18
19 CALayer*layer = [CALayer layer];
20
21 UIImage *navBarImage = [UIImage imageNamed:@"navigationBarBackground.png"];
22
23 layer.contents = (id)navBarImage.CGImage;
24
25 layer.frame= CGRectMake(0, 0, 320, navBarImage.size.height);
26
27 [bar.layer insertSublayer:layer atIndex:0];
28
29 _barBackLayer = layer;
30
31 }
32
33
34 #pragma mark -
35
36 #pragma mark UINavigationControllerDelegate
37
38 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
39
40 [_barBackLayer removeFromSuperlayer];
41
42 [navigationController.navigationBar.layer insertSublayer:_barBackLayeratIndex:0];
43
44 }
45
46 @end
// -------------------------------------
// 設置標題
self.navigationItem.title = @”測試;

// 設置左邊的按鈕

UIBarButtonItem *returnButton = [[UIBarButtonItem alloc]initWithTitle:@”返回style:UIBarButtonItemStyleBordered target:self action:@selector(returnMain)];

self.navigationItem.leftBarButtonItem = returnButton;

[returnButton release];

//定義右邊按鈕

UIBarButtonItem *diquButtons = [[UIBarButtonItem alloc]initWithTitle:@”編輯style:UIBarButtonItemStyleBordered target:self action:@selector(selectArea)];

self.navigationItem.rightBarButtonItem = diquButtons;

self.diquButton = diquButtons;

[diquButtons release];

[temp release];

但是如果該方法不是很好用的話 只有用這個方法了

- (void)initNavBarItems:(NSString *)titlename{

// 設置navbar的titleview

UIView *dd = [[UIView alloc]initWithFrame:CGRectMake(-5032544)];

UIImageView *imgs = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"new-nav-bg.png"]];

imgs.frame = CGRectMake(-5032544);

[dd addSubview:imgs];

// 設置標題

UILabel *title = [[UILabel alloc]initWithFrame:CGRectMake(-5332040)];

title.text = titlename;

title.textAlignment = UITextAlignmentCenter;

title.backgroundColor = [UIColor clearColor];

title.textColor = [UIColor whiteColor];

title.font = [UIFont boldSystemFontOfSize:22];

[dd addSubview:title];

// 設置左邊的按鈕

UIButton *left = [UIButton buttonWithType:UIButtonTypeRoundedRect];

left.frame = CGRectMake(1556030);

[dd addSubview:left];

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章