给 UINavigationBar 设置背景图片的最简单方法

本文介绍了一种在iOS应用中自定义导航栏背景和按钮的方法,通过扩展CALayer类来实现背景图片的自定义,并展示了如何自定义返回按钮。此方法避免了直接扩展UINavigationBar类可能带来的全局影响,提供了更灵活的UI定制选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.sina.com.cn/s/blog_4cd8dd130100tyek.html

给 UINavigationBar 设置背景图片的最简单方法

 
  利用objective-c的Category语法 扩展UINavigationBar 类

具体代码为

@interface UINavigationBar (Codoon)

-(void)drawRect:(CGRect)rect;

@end


@implementation UINavigationBar (Codoon)

-(void)drawRect:(CGRect)rect

{

    [[UIImageimageNamed:@"navigation_bar_background.png"]drawInRect:rect];

}

@end



自定义UINavigationBar 按钮

//返回按钮

    UIButton* backButton= [[UIButton buttonWithType:UIButtonTypeCustom] retain];        

    backButton.frame = CGRectMake(0, 0, 51, 30);

    [backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];          

    [backButton addTarget:self action:@selector(backButtonClick) forControlEvents:UIControlEventTouchUpInside];                  

    UIBarButtonItem* backButtonItem= [[UIBarButtonItem alloc] initWithCustomView:backButton];       

    self.navigationItem.leftBarButtonItem = backButtonItem;

    [backButton release];

    [backButtonItem release];




有了这个,你还会扩展drawRect自定义导航栏背景吗?

查了很多资料,网上的自定义导航栏的方法,清一色的是扩展navigationBar的drawRect方法.然而这样的扩展会影响到工程里所有的navigationBar.或许你并不想这么做,而且很多不合常规的UI用这种方法根本没法实现.

做了无数实验,尝试了各种方法,今天跟大家分享一个新方法:

#import <QuartzCore/QuartzCore.h>

 

@interface DDNavigationViewController : UINavigationController<UINavigationControllerDelegate> {

    CALayer *_barBackLayer;

}

 

@end

@implementation DDNavigationViewController

 

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

    self = [super initWithRootViewController:rootViewController];

    self.delegate self;

    return self;

}

- (void)loadView {

    [super loadView];

    

    UINavigationBar *bar = self.navigationBar;

 

    CALayer*layer = [CALayer layer];

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

    layer.contents = (id)navBarImage.CGImage;

    layer.frameCGRectMake(0, 0, 320, navBarImage.size.height);

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

    _barBackLayer = layer;

}

 

#pragma mark -

#pragma mark UINavigationControllerDelegate

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

    [_barBackLayer removeFromSuperlayer];

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

}

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值