博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios之自定义UINavigationBar
阅读量:5911 次
发布时间:2019-06-19

本文共 2745 字,大约阅读时间需要 9 分钟。

在ios5之前的系统中,可以通过定义导航条类别的方式自定义导航条:

@implementation UINavigationBar (CustomImage) - (void)drawRect:(CGRect)rect {
// Drawing code UIImage *image = [[UIImage imageNamed:@"header.png"] retain]; [image drawInRect:CGRectMake(0, 0,self.frame.size.width , self.frame.size.height)]; [image release]; } @end

但在ios5中,这种方式不起作用了。详见ios 5.0发布说明:

在iOS 5中,UINavigationBar, UIToolbar, and UITabBar 的实现方式改变了,因此drawRect:方法不会被调用了。除非在他们的子类中实现。

因此,要在iOS 5.0中继续使用自定义的导航条,这里提供两种方法:

1、使用5.0中新提供的UINavigationBar的方法setBackgroundImage:forBarMetrics:来设置背景。

  但是为了与4.0等系统兼容,在使用该方法前必须先进行判断:(在5.0之前的系统中继续使用原来的方法)

  (需要在每个用到navigationbar的地方都调用该方法,可能改动的地方比较多)

1 UINavigationBar *navBar = [myNavController navigationBar];  2 if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])  3 {
4 // set globablly for all UINavBars 5 [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"brnlthr_nav.jpg"] forBarMetrics:UIBarMetricsDefault]; 6   // ...

 

2、使用UINavigationBar的子类的方式来实现:(用这种方式可以不用对每个使用navigationbar的地方都进行修改,属于懒人做法)

@interface MyNavigationBar : UINavigationBar @end @implementation MyNavigationBar  - (void)drawRect:(CGRect)rect {
  [super drawRect:rect]; } @end @implementation UINavigationBar (LazyNavigationBar) + (Class)class {
return NSClassFromString(@"MyNavigationBar"); } -(void)drawRect:(CGRect)rect {
UIImage *backImage = [UIImage imageNamed:@"backNav.png"];  [backImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end

3.使用category 范畴   来实现

 

@implementationUINavigationBar(MyCustomNavBar) -(void)setBackgroudImage:(UIImage*)image {
CGSize imageSize =[image size]; self.frame =CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width, imageSize.height); UIImageView*backgroundImage =[[UIImageView alloc] initWithImage:image]; backgroundImage.frame =self.bounds; [self addSubview:backgroundImage]; [backgroundImage release]; } @end
//The above swizzling will allow you to set any custom background image for the UINavigationBar(iOS5 & iOS4).

 

 

Here's a less-ugly solution that works for both iOS4 and 5:

@implementationUINavigationBar(CustomBackground) -(UIImage*)barBackground {
return[UIImage imageNamed:@"top-navigation-bar.png"]; } -(void)didMoveToSuperview {
//iOS5 only if([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
[self setBackgroundImage:[self barBackground] forBarMetrics:UIBarMetricsDefault]; } } //this doesn't work on iOS5 but is needed for iOS4 and earlier -(void)drawRect:(CGRect)rect {
//draw image [[self barBackground] drawInRect:rect]; } @end

转载于:https://www.cnblogs.com/yulang314/p/3550499.html

你可能感兴趣的文章
C# PPT 为形状设置三维效果
查看>>
Android DecorView浅析
查看>>
EF(Entity Framework)系统学习系列
查看>>
C 双向链表
查看>>
hdu 5452(树链刨分)
查看>>
Java之IO流总结
查看>>
LVM Linear vs Striped Logical Volumes
查看>>
Mysql主从备份和SQL语句的备份
查看>>
DEDECMS之三 首页、列表页怎么调用文章内容
查看>>
异步与并行~大话目录
查看>>
iOS开发多线程篇 09 —NSOperation简单介绍
查看>>
WINDOWS下调用GetTokenInformation的奇怪之处--两次调用
查看>>
HDU 5813 Elegant Construction 构造
查看>>
Tomcat就是个容器,一种软件
查看>>
php结合redis实现高并发下的抢购、秒杀功能
查看>>
统计服务连接状况
查看>>
Quartz 框架的应用
查看>>
Tomcat编译jsp生成Servlet文件的存放位置
查看>>
Android事件总线(三)otto用法全解析
查看>>
Android 利用线程运行栈StackTraceElement设计Android日志模块
查看>>