2013-01-10 60 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,圖標和sofourth都適用於酒吧按鈕項目 - 當我突出顯示時,我無法獲得這些BarButtonItems的替代圖像。 – arooo

回答

23

我想你應該創建一個custom UIButton背景圖像爲匹配您的配色方案,不同的控制狀態,然後使用這個UIButton作爲一個custom UIBarButtonItem的看法。

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

你或許可以嘗試這樣的。適用於我。

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

也許這將幫助你(只添加文件到項目):

的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 

一些視圖控制器:

#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]設置選定狀態的圖像; 。在你的share方法中,使用UIButton作爲param的類型,並使用這一行進行切換:button.selected =!button.selected;保重。 – smileBot

+0

是的,多數民衆贊成在:) 感謝您的建議@cocoanut。 – Abo3atef