【iOS SDK】UITabBarControllerのmoreボタンの作り方

やま104

2011年06月27日 11:15

iPhoneアプリでは、画面下部にアイコンが並んでて、それをクリックすると画面が切り替わるタブバーというのがある。
SDKに専用のクラスがあるので、それらを使うと実装できる。
その際、iPhoneアプリでは、アイコンが多いとき、一番右のボタンがmoreとなって、そのアイコンをクリックすると、その中に、その他のタブが入っているという構造になってるのだが、じゃあ、これはどうやって実装するのか?という話。

IBで、6個以上タブを追加すると、自動的にmoreになってくれる。(iPhone用の場合)
iPad用だと、もっとたくさんかもしれないけど。とにかく自動でやってくれる。

けど、自動な分、これをカスタマイズしようと思うと、簡単にはいかない。
いくつか設定を変える方法を挙げときます。

・moreの文字を日本語「その他」に変える方法。

iOSの多言語化機能で、moreを「その他」にすればできた。具体的には。(引用してます。元ネタ

プロジェクトのフォルダに、以下の2つのフォルダを作る。
ja.lproj : 日本語リソース用フォルダ
en.lproj : 英語リソース用フォルダ

それから、それぞれのフォルダの下に以下のファイルを置く。
InfoPlist.strings : アプリ名設定用
Localizable.strings : アプリ内で使用する文字列設定用

そしたら、この2つのフォルダをXcodeからリソースに追加する。
で、Xcodeで中身を編集。
まずは、InfoPlist.stringsから。
【ja.lproj/InfoPlist.strings】
CFBundleName = "日本語バージョン";    // 起動時のステータスバーに表示されるアプリ名
CFBundleDisplayName = "日本語";     // アイコンの下に表示されるアプリ名
【en.lproj/InfoPlist.strings】
CFBundleName = "English Version";    // 起動時のステータスバーに表示されるアプリ名
CFBundleDisplayName = "EnVer";     // アイコンの下に表示されるアプリ名

こんな感じで、アプリ名の多国語対応ができちゃう。
次に、アプリ内で使う文字列を書いとくLocalizable.strings。

【ja.lproj/Localizable.strings】
// "Key" = "Value"で書いておく。
"start" = "開始";
"end" = "終了";
"close" = "閉じる";

【en.lproj/Localizable.strings】
// "Key" = "Value"で書いておく。
"start" = "START";
"end" = "END";
"close" = "CLOSE";

そんで、プログラム内の文字列を使いたいところで、例えば
[buttonStart setTitle:NSLocalizedString(@"start", @"") forState:UIControlStateNormal];
とかやればOK。

(追記)これをやらなくても、info.plistの
Localization native development regionをjapanにしたら、日本語になりそうではある。

・moreのナビゲーションバーの色を変える方法

.moreNavigationControllerで多少カスタマイズできる。
ただし、これはIB上での設定みたいなもので、実態はアプリ実行中に作成されるみたい。
具体的には。(引用してます。元ネタ

// selfはUITabBarControllerのインスタンス
self.moreNavigationController.navigationBar.barStyle = UIBarStyleBlack;

これだけだと、その他画面の[編集]ボタンをタップしたときに遷移する配置変更画面のナビゲーションバーまでは変更されないのだ。
ここも変更したい場合、UITabBarControllerDelegateのtabBarController:willBeginCustomizingViewControllers:メソッドを以下のように実装する。
// tabBarControllerのdelegateにselfが設定されていること
// self自体がUITabBarControllerのインスタンスなら self.delegate = self;
- (void)tabBarController:(UITabBarController*)tabBarController
willBeginCustomizingViewControllers:(NSArray*)viewControllers
{
UIView* subviews = [tabBarController.view.subviews objectAtIndex:1];
UINavigationBar* navigationBar = [[subviews subviews] objectAtIndex:0];
navigationBar.barStyle = UIBarStyleBlack;
}

・カスタマイズボタンを消す
ボタン自体の設定はないのだけど。
カスタム可能なビューをnilにすれば、編集ボタンが消えた。

- (void)viewDidLoad {
self.customizableViewControllers=nil;
}

関連記事