美文网首页
UINavigationbar的背景修改方法集合

UINavigationbar的背景修改方法集合

作者: 26b5cc676194 | 来源:发表于2016-01-19 13:12 被阅读367次

    最近我突然发现UINavigationbar背景修改的方法不起作用了,代码如下:

    @implementationUINavigationBar(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中):if([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]){

    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbar.png"]forBarMetrics:UIBarMetricsDefault];

    }

    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.0fgreen:87.0f/255.0fblue:29.0f/255.0falpha: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 = [UIImageimageNamed:@"LOGO_320×44.png"];

    CGContextRefcontext =UIGraphicsGetCurrentContext();

    CGContextTranslateCTM(context,0.0,self.frame.size.height);

    CGContextScaleCTM(context,1.0, -1.0);

    CGPointcenter=self.center;

    CGImageRefcgImage=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:方法

    @interfaceMyNavigationBar : UINavigationBar

    @end

    @implementationMyNavigationBar

    - (void)drawRect:(CGRect)rect {

    [super drawRect:rect];

    }

    @end

    方法二:定义UINavigationBar的一个static函数

    1+ (UINavigationBar *)createNavigationBarWithBackgroundImage:(UIImage *)backgroundImage title:(NSString *)title {

    2UINavigationBar *customNavigationBar = [[[UINavigationBar alloc] initWithFrame:CGRectMake(0,0,320,44)] autorelease];

    3UIImageView *navigationBarBackgroundImageView = [[UIImageView alloc] initWithImage:backgroundImage];

    4[customNavigationBar addSubview:navigationBarBackgroundImageView];

    5UINavigationItem *navigationTitle = [[UINavigationItem alloc] initWithTitle:title];

    6[customNavigationBar pushNavigationItem:navigationTitle animated:NO];

    7[navigationTitle release];

    8[navigationBarBackgroundImageView release];

    9returncustomNavigationBar;

    10}

    复制代码

    下面是在需要生成UINavgationBar 的地方添加的代码*ViewController.m:

    View Code

    1self.navigationController.navigationBar.hidden = YES;

    2UIImage *navigationBarBackgroundImage =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"topbar-bg"ofType:@"png"]];

    3UINavigationBar *customNavigationBar = [YOUR_Util_Class createNavigationBarWithBackgroundImage:navigationBarBackgroundImage title:nil];

    4[self.view addSubview:customNavigationBar];

    5

    6UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0,0.0,75.0,30.0)];

    7if(_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];

    14UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];

    15customNavigationBar.topItem.leftBarButtonItem = backBarButton;

    16

    17[backButton release];

    18[backBarButton release];

    19

    20UIButton *addButton = [[UIButton alloc] initWithFrame:CGRectMake(0,0,43,30)];

    21UIBarButtonItem *addBarButton = [[UIBarButtonItem alloc] initWithCustomView:addButton];

    22if(_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}

    29customNavigationBar.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#pragmaonce

    5#import

    6@interfaceUINavigationBar (UINavigationBarCategory)

    7UIImageView *bg;

    8-(UINavigationBar*)setBackgroundImage:(UIImage*)image;

    9- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;

    10@end

    复制代码

    CustomNavController.m

    1#import"CustomerNavBarController.h"

    2

    3@implementationUINavigationBar (UINavigationBarCategory)

    4-(UINavigationBar*)setBackgroundImage:(UIImage*)image

    5{

    6UINavigationBar *NavBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0,0,320,44)];

    7if(image == nil)returnNavBar;

    8bg = [[UIImageView alloc]initWithImage:image];

    9bg.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];

    13returnNavBar;

    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

    @interfaceDDNavigationViewController : UINavigationController {

    CALayer *_barBackLayer;

    }

    @end

    View Code

    @implementationDDNavigationViewController

    - (id)initWithRootViewController:(UIViewController *)rootViewController {

    self = [super initWithRootViewController:rootViewController];

    self.delegate= self;

    returnself;

    }

    - (void)loadView {

    [super loadView];

    UINavigationBar *bar = self.navigationBar;

    CALayer*layer = [CALayer layer];

    UIImage *navBarImage = [UIImage imageNamed:@"navigationBarBackground.png"];

    layer.contents = (id)navBarImage.CGImage;

    layer.frame= CGRectMake(0,0,320, navBarImage.size.height);

    [bar.layer insertSublayer:layer atIndex:0];

    _barBackLayer = layer;

    }

    #pragmamark -

    #pragmamark UINavigationControllerDelegate

    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    [_barBackLayer removeFromSuperlayer];

    [navigationController.navigationBar.layer insertSublayer:_barBackLayeratIndex:0];

    }

    @end

    # via@新浪微博:王星凯SoWhat

    相关文章

      网友评论

          本文标题:UINavigationbar的背景修改方法集合

          本文链接:https://www.haomeiwen.com/subject/vkoyhttx.html