Hatena::ブログ(Diary)

Kanotomo の iPhone アプリ開発日記 + サポート

2008-11-23

UINavigationBarの背景に画像を使う方法

標準のメモアプリなどを見るとナビゲーションバーの背景に画像を使っているようですが、これはどうやるのでしょう。

UINavigationBarは、tintColorのプロパティで簡単にその色を変えられるようになっていますが、変えられるのは色だけです。

もう少しアプリに個性を持たせるためにナビゲーションバーの背景に画像を使いたい場合もあるでしょう。

f:id:kanotomo:20081123230011p:image


検索してみたところ、以下の書き込みに一つの解決法がありました。

Apple - Support - Discussions - Custom background for UINavigationBar? ...

http://discussions.apple.com/thread.jspa?messageID=8315168&#8315168

ここで書き込まれている方法ではカテゴリーを使ってUINavigationBarを拡張しています。

これでもいいですが、viewWillAppearでいちいち背景画像を再配置しないといけなくって、ちょっと面倒。

なのでいっそUINavigationBarを継承したCustomNavigationBarクラスを作ることにします。

(ただしこの方法はInterface Builderを使う場合です。)

@interface CustomNavigationBar : UINavigationBar {
	UIImageView *backgroundView;
}
@end

@implementation CustomNavigationBar

- (void)setBackgroundImage:(UIImage*)image {
	if(image == NULL){
		return;
	}
	UIImageView *bgView = [[UIImageView alloc]initWithImage:image];
	backgroundView = bgView;
	[self addSubview:backgroundView];
	[self sendSubviewToBack:backgroundView];
	[bgView release];
}

- (id)initWithCoder:(NSCoder *)aDecoder {
	if (self = [super initWithCoder:aDecoder]) {
		[self setBackgroundImage:[UIImage imageNamed:@"NavBarBackground.png"]];
	}
	return self;
}

- (void)pushNavigationItem:(UINavigationItem *)item animated:(BOOL)animated {
	[super pushNavigationItem:item animated:animated];
	[self sendSubviewToBack:backgroundView];
}

- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated {
	[super popNavigationItemAnimated:YES];
	[self sendSubviewToBack:backgroundView];
	return [self topItem];
}

- (void)dealloc {
	[backgroundView release];
	[super dealloc];
}

@end

あとはInterface BuilderからUINavigationController内のUINavigationBarのクラスを新しいCustomNavigationBarに変更します。

これでいくらpushしようがpopしようが自動的にナビゲーションバーの背景が画像になります。


ということで、こんな感じにナビゲーションバーの背景を画像にすることができました。

f:id:kanotomo:20081123225119p:image

間違いとかもっと簡単な方法とかあったらコメントください。

七氏七氏 2009/11/04 10:04 3.1になってpushNavigationItemが呼ばれなくなりましたよね…苦笑
何か別のいい方法が無いか模索中です。。。

zuccoizuccoi 2010/10/24 13:16 もっと簡単な方法見つけたのでブログに書きました。サブクラスとか作らずにいけます。よかったらぜひ。http://bit.ly/9eWGoR

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証