2012-11-13 72 views
1

有沒有一種方法來定製所有uibarbuttonitems有一個背景圖像,而不使用UIApperance?不幸的是,我們的代碼庫有一些限制,我們無法使用UIAppearance,所以我正在尋找替代方案。定製uibarbuttonitem沒有uppeppearance

在此先感謝。

編輯:我能做到這一點,通過繼承UIBarButtonItem,它適用於我的大多數按鈕...但我特別想知道如何使用默認按鈕,如UITableView編輯按鈕和UINavigationController後扣。

謝謝!

回答

2

您也可以像這樣創建子類。首先我要去製作UIBarButtonItem的子類。我的CustomBarButtonItem.h應該是這樣的。

@interface CustomBarButtonItem : UIBarButtonItem 

+ (CustomBarButtonItem *)sharedInstance; 
- (UIBarButtonItem *)backButtonwithTarget:(id)target andAction:(SEL)action; 


@end 

然後我的CustomBarButtonItem.m裏面應該是這樣的。

@implementation CustomBarButtonItem 

static CustomBarButtonItem * _sharedInstance = nil; 

+ (CustomBarButtonItem *)sharedInstance 
{ 
    if (_sharedInstance != nil) 
    { 
     return _sharedInstance; 
    } 
    _sharedInstance = [[CustomBarButtonItem alloc] init]; 

    return _sharedInstance; 
} 

- (UIBarButtonItem *)backButtonwithTarget:(id)target andAction:(SEL)action 
{ 
    UIImage *backImage = [UIImage imageNamed:@"back_btn_normal.png"]; 
    UIImage *backPressed = [UIImage imageNamed:@"back_btn_hilight.png"]; 
    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [backButton addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; 
    [backButton setBackgroundImage:backImage forState:UIControlStateNormal]; 
    [backButton setBackgroundImage:backPressed forState:UIControlStateHighlighted]; 

    const CGFloat BarButtonOffset = 5.0f; 
    [backButton setFrame:CGRectMake(BarButtonOffset, 0, backImage.size.width, backImage.size.height)]; 

    UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, backImage.size.width, backImage.size.height)]; 
    [containerView addSubview:backButton]; 

    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:containerView]; 
    return item; 
} 
@end 

然後,無論您想要自定義NavigationItem(導航欄中的按鈕),您可以將自定義的代碼放在下面。

- (void)viewDidLoad 
{ 
    self.navigationItem.leftBarButtonItem = [[CustomBarButtonItem sharedInstance] backButtonwithTarget:self andAction:@selector(searchButtonTapped:)]; 
} 

我所有的代碼工作正常。希望它會幫助你。

+0

這就是我所做的......但這並不能解決UINavigationController後退按鈕或UITableViewController默認編輯按鈕等問題。 – VTS12

+0

你必須在你的ViewController裏面調用這個函數。 self.navigationItem.rightBarButtonItem = [[CustomBarButtonItem sharedInstance] checkinButtonwithTarget:self andAction:@selector(revealMenu :)]; – IKQ

+0

在哪個按鈕上對ViewController進行調用?我正在嘗試自定義UINavigationController上的後退按鈕... – VTS12

0

你可以做這樣的事情。只是將它複製出我的項目。

_leftBarButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:[self imageButton]] 
                  style:UIBarButtonItemStyleBordered 
                 target:self 
                 action:@selector(showLeftViewController)]; 

    [navController.navigationBar.topItem setLeftBarButtonItem:_leftBarButton]; 
+0

因此,對於每個ViewController,我需要設置它的後退按鈕? – VTS12

+0

你可以把它放在可以把圖像和標題作爲參數的單件,並從你的每個控制器調用它。我會做。除非有更好的方法 –

0

要做到這一點:在UINavigationBar的創建類別,並覆蓋方法的drawRect

@implementation UINavigationBar (CustomBackground) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed: @"background"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 
@end 

這段代碼可以讓你在一個項目更改背景爲所有UINavigationBar的。