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

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

你可能感兴趣的:(UI,扩展,action,interface,layer)