UINavigationbar的背景修改方法集合

本文介绍了在不同iOS版本中自定义UINavigationBar背景的方法。针对iOS5及以下版本提供了多种解决方案,包括重写drawRect方法、使用静态函数创建自定义导航栏、重写setBackgroundImage方法及利用CALayer进行定制。


最近我突然发现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];

}
内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值