i2iWEBp[c

UINavigationBarのtintColor変更がボタンに反映されない事象の回避方法

9月 16th, 2009 by 吉川英一(えど)

iPhoneアプリ「ぱんたいま~」「ぱんたいま~2」「Shake3G」の開発を担当しました吉川と申します。このブログでは初登場となります。携帯電話やiPhone関係は趣味兼仕事だったりします。いきおいブログの記事もそれ系が多くなると思いますが、よろしくお願いいたします。

さて今回は「ぱんたいま~2」開発時に遭遇した、iPhoneOS3.xのちょっとした癖と、その回避方法を紹介します。

「ぱんたいま~2」で実装されたテーマ切替機能では、テーマを切り替えるときにテーマ一覧画面自身にもテーマを再適用します。その時にUINavigationBarのtintColorプロパティを変更した際、UINavigationBarの中に存在するボタンの色が切り替わらないという事象が発生しました。少なくともiPhoneOS3.0、3.1で確認済みです。

UINavigationBar001 UINavigationBar002

色が切り替わらないのはtintColorを変更した直後だけで、ボタンを1回押すと新しい色が適用されるのですが、せっかくのテーマ切替機能ですから、中途半端に切り替わるこの状態は避けたいところ。OSのバグといえるかどうかは微妙なところですが、結局以下のようにして回避しました。

	// NavigationBar更新
        //"[UIColor blackColor]"の部分は適宜変更してください
	self.navigationController.navigationBar.tintColor
        = [UIColor blackColor];

	// NavigationBar内の戻るボタン色が更新されない事象の回避
	for (UIView* subView in self.navigationController.navigationBar.subviews)
	{
		[subView setNeedsDisplay];
	}

7~10行目のfor (…)ループで、UINavigationBarに属するサブViewに対してそれぞれsetNeedsDisplayメソッドを呼んでやると、tintColorを変更した後にボタンの再描画処理が走るため、ボタンの色も同時に変更されるようになります。

同じような事象にぶつかったときには参考にしてみてください。

Posted in 技術情報 | No Comments »

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.