带有颜色的UIBarButtonItem?

50
可以将UIBarButtonItem设置为红色吗?
11个回答

63

如果有人正在寻找能够完全复制简单UIBarButtonItem的代码:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage:[UIImage imageNamed:@"delete.png"] forState:UIControlStateNormal];
[button setTitle:@"Delete" forState:UIControlStateNormal];
button.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0f];
[button.layer setCornerRadius:4.0f];
[button.layer setMasksToBounds:YES];
[button.layer setBorderWidth:1.0f];
[button.layer setBorderColor: [[UIColor grayColor] CGColor]];
button.frame=CGRectMake(0.0, 100.0, 60.0, 30.0);
[button addTarget:self action:@selector(batchDelete) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem* deleteItem = [[UIBarButtonItem alloc] initWithCustomView:button];

而delete.png是:

delete.png


8
需要添加QuartzCore库到您的项目中,并在类中导入它以使用CALayer方法。 - Johanisma
6
为了方便他人查找,这里是#import <QuartzCore/QuartzCore.h>的翻译: - Dan J
2
我认为默认的圆角半径可能是5.0f而不是4.0f。此外,人们可能更喜欢使用1像素宽的图像来保持图像小。不过,这篇文章还是很有用的,谢谢! - Dan J
你是否有这张蓝色的图片? - newton_guima
不要将UIButton添加到UIBarButtonItem中,而应该创建一个自定义的UIView并将其添加到UIBarButtonItem中。 - Brody Robertson
@bdrobert 但是 addTarget 怎么办 - 如果它不是按钮,你怎么按UIView?或者这应该在包装它的UIBarButtonItem上完成吗? - Rhubarb

36
为什么不直接这样写:
[[self editButtonItem] setTintColor:[UIColor redColor]];

(适用于SDK 4.*、iOS 5及以上版本)


Swift 3: barButtonItem.tintColor = .red - Donn Lee

27

你可以创建自定义的UIButton,设计你想要的外观,并将其初始化为UIBarButtonItem的自定义视图。

UIButton *button = [UIButton buttonWithType:....];
...(customize your button)...

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];

1
但是这并不能为您提供一个与iOS默认渲染相匹配的UIBarButtonItem,除非您愿意像Scott那样费力地复制iOS默认的渲染行为。然而,如果您想要偏离默认外观,那么这显然是正确的方法。 - charshep

7

在iOS 5中,您可以设置UIBarButtonItem的tintColor属性。如果您需要支持iOS 4,请查看此博客文章。该文章详细介绍了如何使用一个外观类似于单个按钮的UISegmentedControl。


3
使用自定义图像无法生效,因为它只使用alpha通道来渲染按钮。

2

好的,实际上在我看来有一个更好的解决方案,可以减少代码量并使用本地UI控件。

诀窍是使用UISegmentedControl,并删除除一个以外的所有段落。(不能在IB中完成,必须通过编程完成)。

完成后,您设置色彩渲染,然后创建一个UIBarButtonItem,将UISegmentedControl作为自定义视图传递给它。

这位先生使用该技术创建了一个非常出色的UIBarButtonItem类别:

http://fredandrandall.com/blog/2011/03/31/how-to-change-the-color-of-a-uibarbuttonitem/


如果你像我一样需要支持4.3,那么这是一个很好的建议。我会按照链接中详细说明的类别进行操作。 - David H

1
如果是UIToolbar的UIBarButtonItem,请在您想要添加此代码的文件中实现前设置。
@class UIToolbarTextButton;

然后将工具栏按钮更改为以下内容:

   for (UIView *view in self.navigationController.toolbar.subviews) {
        NSLog(@"%@", [[view class] description]);
        if ([[[view class] description] isEqualToString:@"UIToolbarTextButton"]) {
            [(UIToolbarTextButton *)view setTintColor:yourcolor];
        }
    }   

1

您可以创建自定义图像并将其用于按钮。否则,如果您已将导航栏或工具栏的tintColor设置为红色,则这些按钮项也将显示为红色。


0

当您在Storyboard中设置了UIBarButtonItem时,您必须在viewWillAppear()viewDidAppear()方法中设置tintColor(将其放在viewDidLoad()中对我来说不起作用...):

- (void)viewWillAppear {
    [super viewWillAppear];
    [[self editButtonItem] setTintColor:[UIColor redColor]];
}

或者在Swift中:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    editButtonItem.tintColor = UIColor.redColor()
}

注意:已在iOS 8/9上进行测试。


0
我想要对这个突出的解决方案添加一些内容。如果你使用子类化,它将不会执行故事板定义的segue和分配给UIBarButtonItem的选择器。此外,“target”和“action”属性也没有在UIBarButtonItem中设置,因此您无法从子类中访问它们并将它们分配给您的UIButton。
我通过向我的子类添加了两个属性(使用ARC)来解决这个问题:
@property (nonatomic, weak) id targetViewController;
@property (nonatomic, strong) NSString *segueIdentifier;

接下来,在您的子类的初始化中,将以下内容添加到接受答案代码中:
[button addTarget:self action:@selector(performAction) forControlEvents:UIControlEventTouchUpInside];

还有一个函数:

- (void)performAction {
    if (_targetViewController && _segueIdentifier) {
        [_targetViewController performSegueWithIdentifier:_segueIdentifier sender:self];
    } else {
        NSLog(@"Requires targetViewController and segueIdentifier to be set");
    }
}

最后,在您托管所有内容的主视图控制器中,在“viewDidLoad”中添加以下内容:
_fancyBarButtonItem.segueIdentifier = @"NewTransaction";
_fancyBarButtonItem.targetViewController = self;

希望这能帮助其他人在使用故事板/iOS5时节省时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接