12

私は自分のブログでチュートリアルを行ったので、一番下 (スタック) のビューコントローラーのタイトルを表示できる伸縮可能なボタンを作成する方法を知っています。しかし、私が望んでいたのは、アイコン (HOME の家のようなもの) を持ち、テキストを持たず、サイズも変更しないことです。

私のカスタム画像と以下のこのコードを使用して、タイトルが上にある(望ましくない)引き伸ばされたバージョン(望ましくない)を取得し、クリックすると色合い/強調表示されます(良いです)。

UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

スクリーンショット 1

今、私はここで検索し、古い回答を返し、私にとって奇妙な結果をもたらす同様の質問をすべて読みました。これが私が試したコードです。

  UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStyleBordered target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;

この方法では、カスタム イメージ ボタンが引き伸ばされず (良い)、テキストも表示されませんが (必要なもの)、その下に元の青いボタンがまだあり (WTF)、カスタム ボタンをクリックしても色がつきません。 、その下の青いボタンだけがそうです!

スクリーンショット 2

助けてください、何が足りないのですか?

*アップデート

サイズ変更可能な画像を使用して、少し修正しました。これにより、「ストレッチ」しないように強制されます

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

私がしなければならなかったボタンに表示されるタイトルを修正するには

self.title =@" ";

これは少し汚い修正ですが、機能しているようです。今残っている唯一の問題は、別のビューに別の戻るボタンが必要であり、この方法が問題を引き起こしていることです。ボタンを設定する最後のビューは、他のすべてのビューをオーバーライドします。結局、アプリの操作方法によっては、前のビューに戻ると間違った戻るボタンが表示され、正しいボタンにリセットされることはありません。


更新 2: 潜在的なアイデア:

以下は合理的な解決策でしょうか、それとも何かを壊す可能性のあるハックですか?

デフォルトの戻るボタンを非表示にすると、

[self.navigationItem setHidesBackButton:YES animated:NO];

...そして、カスタム UIBarButtonItem を使用して、実際に戻るボタンの位置に配置したいスタイルのボタンを使用し、タップ時にpopViewControllerAnimated:メッセージを UINavigationController に送信します。

より堅牢なソリューションを知っている場合は、共有してください。ありがとうございます。

4

5 に答える 5

13

あなたの現在の解決策を仮定すると

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

は受け入れられるので、残っている唯一の問題は、ビュー間を行き来するときにそのボタンの外観を更新する方法です。機能する可能性のあるアプローチは、各コントローラーのviewWillAppear:メソッドで上記のコードを実行することです。

- (void)viewWillAppear:(BOOL)animated {
    UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
}

カスタム を使用する現在のアプローチに満足できない場合はUIBarButtonItem、バー ボタン項目を で初期化することをお勧めしますinitWithCustomView:。この場合、たとえば、UIImageView好きな画像で a を指定すると、動作するはずです。

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:[UIImageView ...]];

お役に立てれば。

于 2012-09-12T18:29:01.757 に答える
9

iOS 5以降では、を使用します[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"someimage.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]

于 2012-05-31T01:12:14.223 に答える
3

プロジェクトで使用したいくつかのコード:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *btnImg = [UIImage imageNamed:@"ButtonRetourInactive"];
[btn setImage:btnImg forState:UIControlStateNormal];

btn.frame = CGRectMake(0, 0, btnImg.size.width, btnImg.size.height);
[btn addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:btn] autorelease];

これは iOS 4 および 3 でも機能することに注意してください。

于 2012-09-13T10:29:23.563 に答える
0

ストーリー ボードを使用している場合は、簡単すぎます。丸い長方形のボタンを取り、ナビゲーション バーに配置します。次に、ボタンをダブルクリックします(選択すると、最初はバーボタンの属性のみが表示されますが、2回選択すると、通常のUIボタンをカスタマイズしているかのようにすべてのプロパティを変更できます).

于 2012-09-13T09:31:21.707 に答える
0

UIAppearanceこの場合は役に立ちません。

私は使用しようとしました: - [UIBarButtonItem initWithCustomView:]. ここのビューでは、背景画像とタイトルを自由に追加できます。

于 2012-09-13T09:42:06.450 に答える