在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];