2013-01-10 14 views
7

私は自分のUIBarButtonItemにカスタムの押された画像を設定しようとしていますが、何も動作していないようです。私の理解から、以下のコードは動作するはずですが、強調表示された状態の画像を設定しているにもかかわらず、ボタンは押されたときに全く同じように見えます。カスタム "押された" UIBarButtonItemの背景

アイデア?

UIImage *barButtonBackground = [[UIImage imageNamed:ANBarButtonItemBackgroundImageName] resizableImageWithCapInsets:UIEdgeInsetsMake(5.0f,5.0f, 5.0f, 5.0f)]; 
UIImage *barButtonPressedBackground = [[UIImage imageNamed:ANBarButtonPressedImageName] resizableImageWithCapInsets:UIEdgeInsetsMake(5.0f,5.0f, 5.0f, 5.0f)]; 

[self.navigationItem.leftBarButtonItem setBackgroundImage:barButtonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.navigationItem.rightBarButtonItem setBackgroundImage:barButtonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

[self.navigationItem.leftBarButtonItem setBackgroundImage:barButtonPressedBackground forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
[self.navigationItem.rightBarButtonItem setBackgroundImage:barButtonPressedBackground forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
+0

どのようにあなたのボタンを作成していますか?あなたは実際にどの画像を見ることができますか? – foundry

+0

実際に押した画像が実際に異なっていますか?イメージを交換してみてください。 –

+0

私は両方の画像をチェックしました。違いはあります。ボタンはストーリーボードに作成されます。 IBActions、アイコンなどは、すべてボタンのボタンアイテムで機能します - 強調表示されたときに、これらのBarButtonItemに表示される代替画像を取得できません。 – arooo

答えて

23

は、私はあなたがしてcustom UIBarButtonItemためのビューとして、このUIButtonを使用し、あなたのカラースキームに合わせ異なる制御状態ためcustom UIButton背景画像とを作成するべきだと思います。あなたには、いくつかの他のリファレンスは、あなたがこの美しいリンクを介して行くことができますしたい場合は

UIButton *customButton = [UIButton buttonWithType:...]; 

[customButton setBackgroundImage:barButtonBackground forState:UIControlStateNormal]; 
[customButton setBackgroundImage:barButtonPressedBackground forState:UIControlStateSelected]; 

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView: customButton]; 

Using Appearance Proxy to Style Apps

+1

実際のUIBarButtonItemsでこれを行う簡単な方法があることを本当に望んでいましたが、これは私が見つけることができる最良の方法のように見えます。ありがとう。 – arooo

+0

これはうまくいくはずですが、異なる状態(背景画像ではない)に対して異なる画像を設定したい場合はどうすればよいでしょうか? UIBarButtonItemのsetImageメソッドはforStateメソッドを持っていないようです...私は背景だけでなく変更するためにイメージ自体が必要です。これについてのアイデアは? – Stan

+0

スタンと同じ質問? – user1010819

3

あなたは、おそらくこのようにしてみてください。私のために働く。

UIBarButtonItem + customLook.h

#import <UIKit/UIKit.h> 

@interface UIBarButtonItem (customLook) 

+ (UIBarButtonItem *)barButtonItemWithImage:(UIImage *)image selectedBackGroundImage:(UIImage *)selected target:(id)target action:(SEL)selector; 

@end 

UIBarButtonItem + customLook.m

#import "UIBarButtonItem+customLook.h" 

@implementation UIBarButtonItem (customLook) 

+ (UIBarButtonItem *)barButtonItemWithImage:(UIImage *)image selectedBackGroundImage:(UIImage *)selected target:(id)target action:(SEL)selector 
{ 
    UIButton* someButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [someButton setImage:image forState:UIControlStateNormal]; 
    [someButton setBackgroundImage:selected forState:UIControlStateSelected]; 

    CGSize size = image.size; 
    CGRect frame = CGRectZero; 
    frame.size.width = size.width; 
    frame.size.height = 30.0f; // Standart height 
    someButton.frame = frame; 

    [someButton addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithCustomView:someButton]; 

    return backButton; 
} 

@end 

一部:

UIImage* image3 = [UIImage imageNamed:@"mail-48_24.png"]; 
CGRect frameimg = CGRectMake(0, 0, image3.size.width, image3.size.height); 
UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg]; 
[someButton setBackgroundImage:image3 forState:UIControlStateNormal]; 
[someButton addTarget:self action:@selector(sendmail) 
    forControlEvents:UIControlEventTouchUpInside]; 
[someButton setShowsTouchWhenHighlighted:YES]; 

UIBarButtonItem *mailbutton =[[UIBarButtonItem alloc] initWithCustomView:someButton]; 
self.navigationItem.rightBarButtonItem=mailbutton; 
[someButton release]; 
2

多分これは(ちょうどそのプロジェクトにファイルを追加)のお手伝いをしますビューコントローラ:

#import "UIBarButtonItem+customLook.h" 
... 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIBarButtonItem *bbi = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"29-heart-selected.png"] 
              selectedBackGroundImage:[UIImage imageNamed:@"DarkButton_Pressed.png"] 
                  target:self 
                  action:@selector(someAction:)]; 
    self.navigationItem.rightBarButtonItem = bbi; 
} 

...

- (void)someAction:(id)sender 
{ 
    [(UIButton *)sender setSelected:YES]; 
} 
1
UIImage* btnImage = [UIImage imageNamed:@"share-icon-deselected-16x16.png"]; 
    CGRect frameimg = CGRectMake(0, 0, btnImage.size.width, btnImage.size.height); 
    UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg]; 
    [someButton setBackgroundImage:btnImage forState:UIControlStateNormal]; 
    [someButton addTarget:self action:@selector(share:) 
     forControlEvents:UIControlEventTouchUpInside]; 
    [someButton setShowsTouchWhenHighlighted:YES]; 

    UIBarButtonItem *mailbutton =[[UIBarButtonItem alloc] initWithCustomView:someButton]; 
    self.navigationItem.rightBarButtonItem=mailbutton; 




- (void)share:(id)sender{ 
    UIButton*btn = (UIButton*)sender; 
    if (btn.isSelected) 
    { 
     [btn setSelected:NO]; 
     [btn setBackgroundImage:[UIImage imageNamed:@"share-icon-deselected-16x16.png"] forState:UIControlStateNormal]; 
    } 
    else 
    { 
     [btn setSelected:YES]; 
     [btn setBackgroundImage:[UIImage imageNamed:@"share-icon-selected-16x16.png"] forState:UIControlStateNormal]; 
    } 
}; 
+1

私はあなたの提案が画像の幅と高さを使用するのが好きです。しかし、私にいくつかの提案をさせてください。あなたのボタンをセットアップするとき、[someButton setBackgroundImage:selectedImage forState:UIControlStateSelected]という行で、選択した状態のイメージを設定します。 。あなたの共有メソッドでは、UIButtonをparamの型として使い、この行を使って切り替えます:button.selected =!button.selected;世話をする。 – smileBot

+0

はい、そうです:) あなたの提案@ココナッツをありがとう。 – Abo3atef

関連する問題