• 学习笔记: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)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
  • 相关阅读:
    P1016 旅行家的预算
    导航菜单全部解释调用外部样式
    css调用外部样式和css样式说明剧中显示
    两种调用外部样式的方法
    css行内样式
    css选择器集体声明
    CSS用类选择器在本页写样式
    CSS用Id选择器在本页写样式
    css用标签选择器在本页写样式
    CSS本页写样式
  • 原文地址:https://www.cnblogs.com/martin1009/p/2583971.html
Copyright © 2020-2023  润新知