UINavigationbar的背景修改方法集合
最近我突然发现UINavigationbar背景修改的方法不起作用了,代码如下:
1
2 3 4 5 6 7 8 9 |
@implementation UINavigationBar (CustomImage)
-(void)drawRect:(CGRect)rect @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:
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
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
转载于:https://www.cnblogs.com/linyawen/archive/2012/07/16/2594131.html
UINavigationbar的背景修改方法集合相关推荐
- 学习笔记:UINavigationbar的背景修改方法集合
最近我突然发现UINavigationbar背景修改的方法不起作用了,代码如下: 1 2 3 4 5 6 7 8 9 @implementation UINavigationBar (CustomIm ...
- iphone iPhone开发中为UINavigationBar设置背景图片方法
1:原文摘自:http://mobile.51cto.com/iphone-284865.htm iPhone开发中为UINavigationBar设置背景图片方法是本文要介绍的内容,在iPhone开 ...
- NCC修改logo及背景图片方法
登陆页面logo logo大小 208 * 53 图片路径: /nccloud/resources/uap/public/img/logo.png 修改方法:替换 内部页面头部logo 图片大小: ...
- 锁定计算机 背景图片,浅谈win7系统中电脑开机的背景图片修改方法
在操作电脑中无奇不有,为了让电脑变得更有个性,特别用户就想改掉原有的经典的WINDOWS开机背景,换上自己喜欢的开机背景图片,在win7系统下对于怎么设置这个过程,下面豆豆来详细介绍下修改方法. 浅谈 ...
- 荣耀手机怎么修改计算机的背景,王者荣耀登陆界面怎么修改 登录背景替换方法...
这几天在抖音上看到有人居然修改了王者荣耀的登录界面,看着还是非常酷炫的呢,作为玩家的话也想要修改,不知道怎么替换的话可以看下面的教程. 类别:图片拍照 大小:4.12M 语言:简体中文 评分 ...
- php layer弹出层更改背景,浅谈layer弹出层按钮颜色修改方法
layer弹出层有多种格式的弹出,使用方法也不细述. 在弹出确认框可使用confirm或open方式 在open中 layer.open({ content: '确认提交?', btn: [" ...
- 自定义UINavigationBar的背景【转】
from:http://cocoa.venj.me/blog/custom-navbar-background/ 为了让我们的应用程序更加美观,我们往往希望对iPhone自带的控件进行一点自定义.比如 ...
- 一键修改计算机名和用户名,电脑用户名怎么改_电脑用户名(计算机名)修改方法_牛游戏网...
修改电脑用户名可以有效得保护个人信息,比如一些玩家在玩家游戏的时候会出现问题,所以需要把用户名改成英文,那么问题来了,如何修改用户名呢?下面小编为大家详细介绍下电脑用户名修改方法,不知道怎么修改的玩家 ...
- MongoDB进阶系列(11)——“改”的那些事(二)文档的keyvalue为数组的修改方法...
2019独角兽企业重金招聘Python工程师标准>>> 本文将讨论关于文档中keyvalue为数组的情况如何修改数组. 首先,创建一个c4集合,集合中的文档包含一个arrint字段, ...
最新文章
- python类型-python基础之五大标准数据类型
- lt;备份gt;10月18日 DNS
- linux系统中 库分为静态库和,你知道linux 静态库和共享库?
- 通过加载 QSS 文件的方式美化 QT 界面
- git clone 仓库的部分代码
- 微信搜一搜品牌官方区新增视频号触点
- puppet连载15:搭建zabbix服务端、客户端
- 三次握手的本质_动画讲解TCP的3次握手,4次挥手,让你一次看明白
- FRM-92120: Registry.dat
- Google 地球专业版离线下载
- 基于互联网位置数据的通勤特征挖掘技术
- 百科不全书之Python常用库
- WIPE与Format的种种神马情况
- panabit安装和默认密码
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
- 安全帽识别的系统应用
- 51假期读书笔记(下)——流畅的python
- 三角形顺时针和逆时针的判定
- UVA - 11400 Lighting System Design(照明系统设计)(dp)
- 汉字转化为拼音,支持多音字
热门文章
- 启用Windows Server 2012的远程桌面
- springboot 注解动态赋值_java springboot动态给注解属性参数赋值
- sudo修改文件夹名字_修改mac os帐户的短名称和个人文件夹
- android点击屏幕特效,Android自定义控件(特效一) 点击屏幕,根据所点击的位置绘制圆环...
- 苹果手机怎么编辑word文档_原创首发:编辑和修改PDF文档,将PDF转换为WORD技巧...
- linux 根据进程号查看对应的进程
- springboot 实现策略模式
- javax.el.ELException: Provider com.sun.el.ExpressionFactoryImpl not found
- 人人都能学会的 Python 多线程指南!
- matlab 水平投影,科学网—Matlab中如何将投影信息写入到shape文件中 - 朱永超的博文...