ios 4およびios 5の下でNavigationBarの戻りボタンをカスタマイズ


ios 4でナビゲーションバーの戻るボタンをカスタマイズし、実際に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を直接欲しいタイトルに置き換えることができます.
ios 5では、カスタムリターンボタンが簡単です.たとえば、viewController 1 pushViewControllerはviewController 2を使用しています.viewController 2の戻るボタンをカスタマイズする必要があります.viewController 1のファイルに次のコードを追加するだけです.
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];