有没有办法在不使用 UIApperance 的情况下自定义所有 uibarbuttonitems 以获得背景图像?不幸的是,我们的代码库有一些限制,我们无法使用 UIAppearance,所以我正在寻找替代方案。
提前致谢。
编辑:我可以通过继承 UIBarButtonItem 来做到这一点,它适用于我的大多数按钮......但我特别想知道如何使用 UITableView 编辑按钮和 UINavigationController 后退按钮等默认按钮来做到这一点。
谢谢!
有没有办法在不使用 UIApperance 的情况下自定义所有 uibarbuttonitems 以获得背景图像?不幸的是,我们的代码库有一些限制,我们无法使用 UIAppearance,所以我正在寻找替代方案。
提前致谢。
编辑:我可以通过继承 UIBarButtonItem 来做到这一点,它适用于我的大多数按钮......但我特别想知道如何使用 UITableView 编辑按钮和 UINavigationController 后退按钮等默认按钮来做到这一点。
谢谢!
你也可以像这样创建子类。首先我去创建 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(NavigationBar 中的按钮),您都可以在下面为我自定义代码。
- (void)viewDidLoad
{
self.navigationItem.leftBarButtonItem = [[CustomBarButtonItem sharedInstance] backButtonwithTarget:self andAction:@selector(searchButtonTapped:)];
}
我所有的代码都工作正常。希望它会帮助你。
你可以做这样的事情。刚刚将它从我的项目中复制出来。
_leftBarButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:[self imageButton]]
style:UIBarButtonItemStyleBordered
target:self
action:@selector(showLeftViewController)];
[navController.navigationBar.topItem setLeftBarButtonItem:_leftBarButton];
为此:在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 的背景。