2012-09-25 42 views
14

我知道如何使用-setBackgroundImage: forState: barMetrics:自定義UIBarButtonItem,但我想爲UIBarButtonItemStyleDoneUIBarButtonItemStylePlain使用不同的圖像。分別使用UIAppearance自定義UIBarButtonItem「完成」樣式和「平原」樣式

有沒有一種方法可以使用UIAppearance協議完成此操作?或者我每次需要「完成」樣式按鈕時都必須設置圖像?

(我試過瞎搞,代碼如下所示:

[[UIBarButtonItem appearance] setBackgroundImage:image forState:UIControlStateNormal barMetrics:UIBarButtonItemStyleDone];

但是,這只是設置每欄按鈕與 「完成」 的形象。)

謝謝!

+0

不要ü要更改按鈕,背面的圖像點擊? – AppleDelegate

+0

我已經定製了後退按鈕。我正在尋找不同的「普通」欄按鈕(比如iOS對「完成」和「保存」使用藍色按鈕,而對於「取消」則使用灰色)。 – James

+0

@James,其中一個選項是使用自定義的Done按鈕作爲來自'UIBarButtonItem'的'CustomDoneBarButtonItem'並將其用作'[[CustomDoneBarButtonItem appearance] setBackgroundImage:image forState:UIControlStateNormal barMetrics:UIBarButtonItemStyleDone]'。無論何時添加完成按鈕,都要創建此自定義類的對象並添加它。 – iDev

回答

13

的iOS 6你可以使用的UIBarButtonItem類的新方法:

- (void)setBackgroundImage:(UIImage *)backgroundImage 
        forState:(UIControlState)state 
        style:(UIBarButtonItemStyle)style 
       barMetrics:(UIBarMetrics)barMetrics 

它設置爲指定狀態,樣式和指標的背景圖像。 更多詳細信息,請in the Apple docs

所以要改變所有UIBarButtonItems的外觀,你可以使用類似:

UIImage *doneBackgroundImage = [[UIImage imageNamed:@"button_done.png"] 
    resizableImageWithCapInsets:UIEdgeInsetsMake(0, 4, 0, 4)]; 

[[UIBarButtonItem appearance] setBackgroundImage:doneBackgroundImage 
              forState:UIControlStateNormal 
               style:UIBarButtonItemStyleDone 
              barMetrics:UIBarMetricsDefault]; 
+0

關鍵是不必手動 –

+2

它是官方API,僅在iOS 6中可用(我明確指出)。它完全解決了所描述的問題:「使用UIAppearance協議完成這個[UIBarButtonItemStyleDone和UIBarButtonItemStylePlain的不同圖像]的方式」。 –

+0

對不起,downvote沒有道理讀了它錯 - 完全是我的壞!正確。感謝那:)我需要ios5雖然...否則它會很容易 –

10

的IOS5 *

我發現使用的UIBarButtonItem類的唯一方法:

的UIBarButtonItem + Appearance.h

#import <Foundation/Foundation.h> 

@interface UIBarButtonItem (Appearance) 

+ (void) setupAppearance; 

@end 

的UIBarButtonItem + Appearance.m

#import "UIBarButtonItem+Appearance.h" 
#import <objc/runtime.h> 

@implementation UIBarButtonItem (Appearance) 

+ (void) setupAppearance { 
    [[UIBarButtonItem appearance] setBackgroundImage: [[UIImage imageNamed:@"customButton"] 
                    resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)] 
                 forState: UIControlStateNormal 
                barMetrics: UIBarMetricsDefault]; 

    [[UIBarButtonItem appearance] setBackgroundImage: [[UIImage imageNamed:@"customButtonHiglhighted"] 
                    resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)] 
                 forState: UIControlStateHighlighted 
                barMetrics: UIBarMetricsDefault]; 



    Class klass = objc_getClass("UIBarButtonItem"); 
    Method targetMethod = class_getInstanceMethod(klass, @selector(setStyle:)); 
    Method newMethod = class_getInstanceMethod(klass, @selector(__setStyle:)); 
    method_exchangeImplementations(targetMethod, newMethod); 
} 

- (void) __setStyle:(UIBarButtonItemStyle)style { 
    [self __setStyle:style]; 

    if(style == UIBarButtonItemStyleDone) { 
     [self setBackgroundImage:[[UIImage imageNamed:@"customDoneButton"] resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)] 
         forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
     [self setBackgroundImage:[UIImage imageNamed:@"customDoneButtonClicked"] 
         forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
    } else { 
     [self setBackgroundImage:[[UIImage imageNamed:@"customButton"] resizableImageWithCapInsets: UIEdgeInsetsMake(8, 8, 8, 8)] 
         forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
     [self setBackgroundImage:[UIImage imageNamed:@"customButtonHighlighted"] 
         forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
    } 
} 

@end 

希望這是什麼你正在尋找。 信用這個解決方案去https://gist.github.com/2633081

+0

工作!有點hackish但很酷! –

+1

這是[MethodSwizzling](http://cocoadev.com/wiki/MethodSwizzling)?如果是,則總會有appstore拒絕的風險。 – iDev

+0

@acb是的,但我知道很多應用程序都這樣做,雖然這樣做並沒有合法化,但在這種情況下,我感覺它確定** ** –