3

アプリのナビゲーション コントローラーの外観を次のようにカスタマイズする作業を行っています。

ここに画像の説明を入力

数時間のSO調査の後に発見したように、それを行うにはさまざまな方法があり、いくつかは本当にハックであり、いくつかはそうではありません。アプリが成長するにつれて、将来の痛みを最小限に抑える、これを達成するためのAppleに恵まれた/最もエレガントな方法を見つけることに興味があります. これまでに調べたいくつかのアプローチ:

1) [UINavigationBar の外観] で画像を適用してナビゲーション バーの背景/高さを変更したところ、問題なく動作したようです。

UIImage *navBarImage = [UIImage imageNamed:@"navigation-bar.png"];

[[UINavigationBar appearance] setBackgroundImage:navBarImage
                                   forBarMetrics:UIBarMetricsDefault];

背景/高さの変更を実現する最も「現代的な」方法のようですが、向きの変更には耐えられない可能性が高いです。ここで改善できる点はありますか?

2)プッシュされたビューのviewDidLoadで、デフォルトの戻るボタンを次のように置き換えました

// Set the custom back button
UIImage *buttonImage = [UIImage imageNamed:@"back.png"];

//create the button and assign the image
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:buttonImage forState:UIControlStateNormal];

//set the frame of the button to the size of the image (see note below)
button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);

[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

// offset the back button
button.contentEdgeInsets = UIEdgeInsetsMake(10, 5, -10, -5);

//create a UIBarButtonItem with the button as a custom view
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.leftBarButtonItem = customBarItem;

このソリューションにはあまり満足できません。バーのカスタマイズがナビゲーション スタック上のコントローラーに委ねられているからです。Apple docs からは、 UINavigationBar を完全にサブクラス化し、ナビゲーションコントローラーで一度だけ置き換えることを好むようです。

また、initWithNavigationBarClass:toolbarClass: メソッドを使用してナビゲーション コントローラーを初期化することにより、カスタム UINavigationBar サブクラスを指定することもできます。

それが推奨されるルートでしょうか?[UIBarButtonItem の外観] を介して UINavigationBar のデフォルトの [戻る] ボタンを置き換えることができませんでした。これは、ボタンにテキストを表示しようとしており、テキストを削除すると、ボタンがまったく表示されないためです。提案?

3)ページ タイトルは、navigationItem.titleView を介して別のビューに置き換えられる必要があります。もっと良いものはありますか?

ありがとう!

4

1 に答える 1

1

1) 2 つの UIBarMetrics (UIBarMetricsDefault と UIBarMetricsLandscapePhone の別の画像) に対して 2 つの画像を設定する必要があります。したがって

UIImage *navBarImage = [UIImage imageNamed:@"navigation-bar.png"];
UIImage *navBarImage_Landscape = [UIImage imageNamed:@"navigation-bar-landscape.png"];

[[UINavigationBar appearance] setBackgroundImage:navBarImage
                                   forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundImage:navBarImage_Landscape
                               forBarMetrics:UIBarMetricsLandscapePhone];

2) UINavigationBar をサブクラス化することもできます (前述のように、Apple のデフォルトの方法になります)。または、ボタンだけの場合は、" " (空のテキスト) を渡すことでその動作をハックできます。

3) 何を言っているのかわからない。ナビゲーション バーのタイトルを設定すると、任意のタイトルが表示されます。または、titleViewの別のビューをプラグインできるはずです

setBackgroundImage は iOS 5.0 以降であることに注意してください。

于 2012-11-06T14:56:48.137 に答える