1. ホーム
  2. ios

[解決済み] UIBarButtonItemのカスタム画像とボーダーなし

2023-04-15 17:30:53

質問

UIBarButtonItemにカスタム画像を作成したいのですが、私の画像には特別なボーダーがあるため、iPhoneが追加するボーダーは必要ありません。

戻るボタンと同じで、進むボタンです。

このアプリは社内プロジェクト用なので、Appleが拒否しようが承認しようが、気に入ろうが関係ありません :-)

UIBarButtonItemのinitWithCustomView:vプロパティを使えば、できるのでは?

UIImage *image = [UIImage imageNamed:@"right.png"];

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
[button setBackgroundImage: [[UIImage imageNamed: @"right_clicked.png"] stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateHighlighted];

 button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);

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

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height) ];

[v addSubview:button];

UIBarButtonItem *forward = [[UIBarButtonItem alloc] initWithCustomView:v];

self.navigationItem.rightBarButtonItem= forward;

[v release];
[image release];

これは動作しますが、もしこの処理を10ビューで繰り返さなければならないとしたら、これはDRYではありません。

サブクラス化する必要がありそうですが、どうするのでしょうか?

  • NSView ?
  • UIBarButtonItem ?

ありがとうございます。

よろしくお願いします。

どのように解決するのですか?

UIBarButtonItemをサブクラス化せずに、カスタムカテゴリを使用してメソッドを追加することができます。

@interface UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action;

@end

@implementation UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action{
 // Move your item creation code here
}
@end

したがって、コードのどこでもこのメソッドを呼び出してバーアイテムを作成することができます(ただし、その宣言にヘッダを含めることが必要です)。

追伸:'v' UIView を使用する必要はありません。 UIBarButtonItem を直接カスタムビューとして作成することができます。

P.P.S. あなたのコードに[forward release]も必要です。