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)index17 {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 UINavigationControllerDelegate37 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

posted on 2012-07-16 20:23 linyawen 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/linyawen/archive/2012/07/16/2594131.html

UINavigationbar的背景修改方法集合相关推荐

  1. 学习笔记:UINavigationbar的背景修改方法集合

    最近我突然发现UINavigationbar背景修改的方法不起作用了,代码如下: 1 2 3 4 5 6 7 8 9 @implementation UINavigationBar (CustomIm ...

  2. iphone iPhone开发中为UINavigationBar设置背景图片方法

    1:原文摘自:http://mobile.51cto.com/iphone-284865.htm iPhone开发中为UINavigationBar设置背景图片方法是本文要介绍的内容,在iPhone开 ...

  3. NCC修改logo及背景图片方法

    登陆页面logo logo大小 208 * 53   图片路径: /nccloud/resources/uap/public/img/logo.png 修改方法:替换 内部页面头部logo 图片大小: ...

  4. 锁定计算机 背景图片,浅谈win7系统中电脑开机的背景图片修改方法

    在操作电脑中无奇不有,为了让电脑变得更有个性,特别用户就想改掉原有的经典的WINDOWS开机背景,换上自己喜欢的开机背景图片,在win7系统下对于怎么设置这个过程,下面豆豆来详细介绍下修改方法. 浅谈 ...

  5. 荣耀手机怎么修改计算机的背景,王者荣耀登陆界面怎么修改 登录背景替换方法...

    这几天在抖音上看到有人居然修改了王者荣耀的登录界面,看着还是非常酷炫的呢,作为玩家的话也想要修改,不知道怎么替换的话可以看下面的教程. 类别:图片拍照   大小:4.12M    语言:简体中文 评分 ...

  6. php layer弹出层更改背景,浅谈layer弹出层按钮颜色修改方法

    layer弹出层有多种格式的弹出,使用方法也不细述. 在弹出确认框可使用confirm或open方式 在open中 layer.open({ content: '确认提交?', btn: [" ...

  7. 自定义UINavigationBar的背景【转】

    from:http://cocoa.venj.me/blog/custom-navbar-background/ 为了让我们的应用程序更加美观,我们往往希望对iPhone自带的控件进行一点自定义.比如 ...

  8. 一键修改计算机名和用户名,电脑用户名怎么改_电脑用户名(计算机名)修改方法_牛游戏网...

    修改电脑用户名可以有效得保护个人信息,比如一些玩家在玩家游戏的时候会出现问题,所以需要把用户名改成英文,那么问题来了,如何修改用户名呢?下面小编为大家详细介绍下电脑用户名修改方法,不知道怎么修改的玩家 ...

  9. MongoDB进阶系列(11)——“改”的那些事(二)文档的keyvalue为数组的修改方法...

    2019独角兽企业重金招聘Python工程师标准>>> 本文将讨论关于文档中keyvalue为数组的情况如何修改数组. 首先,创建一个c4集合,集合中的文档包含一个arrint字段, ...

最新文章

  1. python类型-python基础之五大标准数据类型
  2. lt;备份gt;10月18日 DNS
  3. linux系统中 库分为静态库和,你知道linux 静态库和共享库?
  4. 通过加载 QSS 文件的方式美化 QT 界面
  5. git clone 仓库的部分代码
  6. 微信搜一搜品牌官方区新增视频号触点
  7. puppet连载15:搭建zabbix服务端、客户端
  8. 三次握手的本质_动画讲解TCP的3次握手,4次挥手,让你一次看明白
  9. FRM-92120: Registry.dat
  10. Google 地球专业版离线下载
  11. 基于互联网位置数据的通勤特征挖掘技术
  12. 百科不全书之Python常用库
  13. WIPE与Format的种种神马情况
  14. panabit安装和默认密码
  15. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
  16. 安全帽识别的系统应用
  17. 51假期读书笔记(下)——流畅的python
  18. 三角形顺时针和逆时针的判定
  19. UVA - 11400 Lighting System Design(照明系统设计)(dp)
  20. 汉字转化为拼音,支持多音字

热门文章

  1. 启用Windows Server 2012的远程桌面
  2. springboot 注解动态赋值_java springboot动态给注解属性参数赋值
  3. sudo修改文件夹名字_修改mac os帐户的短名称和个人文件夹
  4. android点击屏幕特效,Android自定义控件(特效一) 点击屏幕,根据所点击的位置绘制圆环...
  5. 苹果手机怎么编辑word文档_原创首发:编辑和修改PDF文档,将PDF转换为WORD技巧...
  6. linux 根据进程号查看对应的进程
  7. springboot 实现策略模式
  8. javax.el.ELException: Provider com.sun.el.ExpressionFactoryImpl not found
  9. 人人都能学会的 Python 多线程指南!
  10. matlab 水平投影,科学网—Matlab中如何将投影信息写入到shape文件中 - 朱永超的博文...