Objective c 自定义无uibarbuttonitem外观的uibarbuttonitem

Objective c 自定义无uibarbuttonitem外观的uibarbuttonitem,objective-c,ios,uibarbuttonitem,uiappearance,Objective C,Ios,Uibarbuttonitem,Uiappearance,有没有一种方法可以自定义所有uibarbuttonitems,使其具有背景图像而不使用UIAppearance?不幸的是,我们的代码库有一些限制,我们不能使用UIAppearance,所以我正在寻找一个替代方案 提前谢谢 编辑:我可以通过子类化uiBarButtonim来实现这一点,它适用于我的大多数按钮……但我想知道如何使用默认按钮,如UITableView编辑按钮和UINavigationController backbuttons 谢谢 你可以这样做。只是从我的项目中复制出来的 _l

有没有一种方法可以自定义所有uibarbuttonitems,使其具有背景图像而不使用UIAppearance?不幸的是,我们的代码库有一些限制,我们不能使用UIAppearance,所以我正在寻找一个替代方案

提前谢谢

编辑:我可以通过子类化uiBarButtonim来实现这一点,它适用于我的大多数按钮……但我想知道如何使用默认按钮,如UITableView编辑按钮和UINavigationController backbuttons


谢谢

你可以这样做。只是从我的项目中复制出来的

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

    [navController.navigationBar.topItem setLeftBarButtonItem:_leftBarButton];

您也可以这样创建子类。首先我要做一个uibarbuttonite的子类。我的习惯应该是这样的

@interface CustomBarButtonItem : UIBarButtonItem

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


@end
@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
那么在我的习惯中,我应该是这样的

@interface CustomBarButtonItem : UIBarButtonItem

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


@end
@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:)];
}

我所有的代码都运行良好。希望它能对您有所帮助。

要做到这一点:在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的背景。

因此,对于每个ViewController,我需要像这样设置其back按钮?您可以将其放在singleton上,它可以将图像和标题作为参数,并从每个控制器调用它。我会做的。除非有更好的方法,这就是我所做的…但这并不能解决像UINavigationController后退按钮或UITableViewController默认编辑按钮之类的问题。您必须像下面在ViewController中的代码一样调用此函数。self.navigationItem.rightBarButtonItem=[[CustomBarButtonItem sharedInstance]使用target:self和action:@selector(revealMenu:)]检查按钮;在ViewController中按什么按钮调用它?我正在尝试自定义UINavigationController上的“后退”按钮…现在您可以将RightBarButtonim和LeftBarButtonim修复为您想要的任何形式。您看到我的代码了吗?我正在为navigationItem定制。这意味着您需要自定义的导航控制器按钮。