2012-01-18 13 views
1

完了ボタンを表すカスタムUIBarButtonItemを作成します。 アプリを国際化できるようにしたいので、テキストを直接編集できるようにします。 「Done」ラベルの長さを考慮に入れて、私は伸縮可能なイメージを設計しました。デフォルトの編集ボタンの背景を直接変更することは可能ですか、またはカスタムUIBarButtonItemが必要ですか?もしそうなら、ラベルの長さに応じて背景のstretchableImageを動的にサイズ変更する方法は何でしょうか?完了UIBarButtonItemの背景画像

答えて

7

iOS 5.0のみをターゲットに設定している場合は、新しいUIAppearanceのメソッド-setBackButtonBackgroundImage:forState:barMetrics:を使用してデフォルトの外観を変更することができます。

あなたがiOS版の古いバージョンをサポートする必要がある場合、あなたは、UIBarButtonItemをサブクラスUIButtonインスタンス変数を追加し、それを作成し、あなたのUIBarButtonIteminit方法で–initWithCustomView:を呼び出す必要があります。 UIBarButtonItemUIViewのサブクラスではないため、カスタムイメージを描画することはできません。 UIBarButtonItemwidthプロパティも手動で設定する必要があります。

@interface MYCustomBarButtonItem : UIBarButtonItem 
{ 
    UIButton *button; 
} 
- (id)initWithTitle:(NSString *)title; // name it in concordance with your needs 
@end 

#define kButtonHeight 30 
#define kButtonTitleFontSize 12 
#define kButtonTitlePadding 5 

@implementation MYCustomBarButtonItem 

- (id)initWithTitle:(NSString *)title 
{ 
    button = [UIButton buttonWithType:UIButtonTypeCustom]; // add retain here, and write the dealloc method if you aren't using ARC. Also, release it if self == nil. 
    self = [super initWithCustomView:button]; 
    if (self) { 
     UIFont *titleFont = [UIFont boldSystemFontOfSize:kButtonTitleFontSize]; 
     CGSize titleSize = [title sizeWithFont:titleFont]; 
     CGFloat buttonWidth = titleSize.width + kButtonTitlePadding * 2; 
     button.frame = CGRectMake(0, 0, buttonWidth, kButtonHeight); 
     self.width = buttonWidth; 

     [button setTitle:title forState:UIControlStateNormal]; 

     // Set your styles 
     button.titleLabel.font = titleFont; 

     // Normal state background 
     UIImage *backgroundImage = ...; // create your normal stretchable background image 
     [button setBackgroundImage:backgroundImage forState:UIControlStateNormal]; 

     // Pressed state background 
     backgroundImage = ...; // create your pressed stretchable background image 
     [button setBackgroundImage:backgroundImage forState:UIControlStateHighlighted]; 

     // and so on... 
    } 
    return self; 
} 

@end 

PS。 buttonインスタンスで使用するサブクラスのプロパティtargetactionをオーバーライドすることを忘れないでください。

UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithTitle:@"I am done" style:UIBarButtonItemStyleBordered target:self action:nil]; 
UIImage *stretchable = [[UIImage imageNamed:@"StretchableImage.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:16]; 
[btnDone setBackgroundImage:stretchable forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.navigationItem setRightBarButtonItem:btnDone]; 

A UIBarButtonItemが自動的にラベルの幅に幅です調整しない:

+0

ボタンのサイズ変更は、テキストの幅に応じてどのように行われますか?また、背景を伸縮可能な画像としてどのように設定しますか?ありがとう。 –

+0

'NSString'の' -sizeWithFont: 'メソッドを使います:http://developer.apple.com/library/ios/#documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html。バックグラウンドは 'UIButton'の' -setBackgroundImage:forState: 'で設定されます。 –

+0

@ibeitia、コードを更新しました。 –

2

私はあなたの質問を誤解しているかもしれませんが、私はあなたが望むすべて信じているが、これはあります。

+0

@Stanislav Yagloが正しいです。このソリューションはiOS 5でのみ機能します。古いバージョンをターゲットにする場合は、UIBarButtonItemの単純なサブクラスを作成する必要があります。 – simonbs