学习笔记:UINavigationbar的背景修改方法集合
2012-07-10 08:45
561 查看
最近我突然发现UINavigationbar背景修改的方法不起作用了,代码如下:
发现原来是iOS 5的原因,如果运行在iOS 5以下的版本就没有问题了。经过实验以下方法适合iOS 5(放在ViewDidLoad中):
第一条if语句的作用是防止程序在iOS 5以下的版本中崩溃。
这样,依靠这两段代码,我的UINavigationbar的背景问题在iOS 5及以下版本中得到了完美的解决。
方法一:主要技巧就是用视图的drawInRect:方法绘制
如下为创建了一个UINavigationBar Category
自定义图片背景以下两句代码是关键:
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:方法不会被调用了,所以就不支持这种通过定义导航条类别的方式来自定义导航条了。除非在这类控件的子类中实现。
方法二:定义UINavigationBar的一个static函数
复制代码
下面是在需要生成UINavgationBar 的地方添加的代码 *ViewController.m:
View Code
复制代码
此代码效果图如下:
这一方法转载自:/article/5601614.html
方法三:也是自定义导航条类别,但是重写setBackgroundImage:方法
CustomNavController.h
复制代码
CustomNavController.m
复制代码
调用代码示例:
此方法转载自:/article/5601615.html
方法四:通过导入QuartzCore框架绘制CALayer层来自定义
View Code
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 |
1 2 3 | if ([self.navigationController.navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)]){ [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbar.png"] forBarMetrics:UIBarMetricsDefault]; } |
这样,依靠这两段代码,我的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];
复制代码
此代码效果图如下:
这一方法转载自:/article/5601614.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"]]; //在下面添加你自己的功能代码 *********** }
此方法转载自:/article/5601615.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
相关文章推荐
- [ios开发技巧之]UINavigationbar的背景修改方法集合
- UINavigationbar的背景修改方法集合(ios4和5)
- UINavigationbar的背景修改方法集合
- UINavigationbar的背景修改方法集合
- Java学习笔记之集合(四):LinkedList集合的特点和常用方法
- 学习笔记:Centos6.5永久修改DNS的方法
- Java学习笔记之集合(一):Collection集合的方法
- 学习笔记:C#修改电脑密码方法如下
- 逆向工程核心原理学习笔记(五):实战“打补丁方法”修改字符串
- 学习笔记:ubuntu永久修改DNS的两种方法
- MFC中设置背景色,背景图片和背景音乐的方法【学习笔记1】
- MySQL学习笔记之创建、删除、修改表的方法
- Java学习笔记之集合(二):List集合的常用方法
- R语言工具学习笔记(一)修改字体及背景
- Java学习笔记之集合(七):Map集合的方法
- 学习笔记:ubuntu永久修改DNS的两种方法
- 逆向工程核心原理学习笔记(五):实战“打补丁方法”修改字符串
- 黑马程序员-List集合共性方法,ListIterator学习笔记
- Java学习笔记27(集合框架一:ArrayList回顾、Collection接口方法)