ios4及ios5下自定义NavigationBar的返回按钮

在ios4自定义导航栏的返回按钮,实际上自定义了其 leftBarButtonItem,这里为了便于重用,我定义了一个类:

.h 文件

#import <UIKit/UIKit.h>

@interface NavBackBarButtonItem : UIButton

- (id)initWithTitle:(NSString *)title;

@end

.m 文件

#import "NavBackBarButtonItem.h"

@implementation NavBackBarButtonItem

- (id)initWithTitle:(NSString *)title
{
    self = [super init];
    if (self) {
        UIImage *backBarBtn = [[UIImage imageNamed:@"backBarBtn"] stretchableImageWithLeftCapWidth:13.0 topCapHeight:0.0];
        [self setBackgroundImage:backBarBtn forState:UIControlStateNormal];
        UIFont *font = [UIFont systemFontOfSize:13.0f];
        CGSize size = [title sizeWithFont:font];
        self.frame = CGRectMake(0, 0, size.width + backBarBtn.size.width, backBarBtn.size.height);
        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(13, 0, size.width + backBarBtn.size.width - 13, backBarBtn.size.height)];
        titleLabel.text = title;
        titleLabel.font = font;
        titleLabel.backgroundColor = [UIColor clearColor];
        titleLabel.textColor = [UIColor whiteColor];
        [self addSubview:titleLabel];
        [titleLabel release];
    }
    
    return self;
}

@end


注意,上面的 backBarBtn 是定义返回按钮背景的资源文件,这里我需要返回按钮的箭头是13个像素宽度,然后将资源图片拉伸得到我想要的效果。另外注意在定义按钮的frame的时候,需要先获得一定大小的字体所占有的宽度,然后加上资源图片的宽度,如果你不想让你的返回按钮显得太大的话,那么你在提供backBarBtn的需要注意那13像素右面的宽度了。还有就是我想要把我的文字加在返回按钮的箭头的右边,于是我定义了一个label来显示返回按钮的标题。


popViewController 函数是返回按钮的响应事件

- (void)popViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}

这样在需要自定义返回按钮的类中加入如下代码:

UINavigationItem *item = [self.navigationController.navigationBar.items lastObject];
UIButton *backBtn = [[NavBackBarButtonItem alloc] initWithTitle:item.title];
[backBtn addTarget:self action:@selector(popViewController) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithCustomView:backBtn];
self.navigationItem.leftBarButtonItem = backBarButton;
[backBtn release];
[backBarButton release];

在上面的代码中,由于同一个viewController可能由不能的viewController push 过去的,于是我们在定义返回按钮的标题时需要取得前一个viewController’s navtionItem的 title。navigationBar的items is An array of navigation items managed by the navigation bar. 取出的lastObject就是push当前viewController的那个viewController的navigationItem‘s title,当然,你可以直接将item.title替换成你想要的标题。


在ios5下,自定义返回按钮比较简单。比如,viewController1 pushViewController 了 viewController2,现在需要自定义viewController2的返回按钮,只需要在viewController1的文件里加入如下代码:

UIBarButtonItem *bbtn = [[UIBarButtonItem alloc] initWithTitle:self.navigationItem.title style:UIBarButtonItemStyleBordered target:nil action:nil];
UIImage *backBarBtn = [[UIImage imageNamed:@"backBarBtn"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 13.0, 0.0, 5.0)];
[bbtn setBackButtonBackgroundImage:backBarBtn forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
self.navigationItem.backBarButtonItem = bbtn;
[bbtn release];


你可能感兴趣的:(ios,action,interface,ios5)