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;
}