UIBarButtonItem与颜色?

有可能有一个红色的UIBarButtonItem?

如果有人正在寻找代码来完全复制一个简单的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

为什么不只是:

 [[self editButtonItem] setTintColor:[UIColor redColor]]; 

(在sdk 4. *,ios 5及以上)

您可以创build自定义UIButton与您所需的外观和初始化您的UIBarButtonItem作为自定义视图。

 UIButton *button = [UIButton buttonWithType:....]; ...(customize your button)... UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button]; 

您可以在iOS 5中设置UIBarButtonItem的tintColor属性。如果您需要支持iOS 4,请查看此博客文章 。 它详细使用UISegmentedControl风格看起来像一个单一的button。

使用自定义图像不起作用,因为它只是使用alpha来渲染button。

好吧,实际上有一个更好的解决scheme,在我看来,这涉及到更less的代码,并使用原生的UI控件。

诀窍是使用UISegmentedControl,并删除除了一个的所有部分。 (不能在IB中完成,必须以编程方式完成)。

一旦你完成了,你设置了色彩的颜色,然后创build一个UIBarButtonItem,把UISegmentedControl作为自定义视图传递给它。

这家伙用这个技术来创build一个UIBarButtonItem的类别,它的function非常出色:

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

您可以为button创build自定义图像并使用它。 否则,如果您将导航栏或工具栏的tintColor设置为红色,则其上的button项也会显示为红色。

如果它是UIToolbar的UIBarButtonItem

在你想要这个代码的文件中设置这个之前

 @class UIToolbarTextButton; 

然后更改工具栏button,这样做:

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

如果使用IB(Interface Builder),将UIView从库中拖到UIToolBar ,它将生成具有自定义视图的UIBarButtonItem 。 然后你可以添加你想要的任何其他控件,例如UIButtonUILabelUIActivityIndicatorView

我想添加一些东西到突出显示的解决scheme。 如果你做了这个子类,它将不会执行分配给UIBarButtonItem的storyboard-defied segues和selectors。 另外,'target'和'action'属性在UIBarButtonItem中没有设置,所以你不能从子类访问它们,并把它们分配给你的UIButton。

我通过添加2个属性到我的子类(使用ARC)来解决这个问题:

 @property (nonatomic, weak) id targetViewController; @property (nonatomic, strong) NSString *segueIdentifier; 

接下来,在你的子类的init中,添加类似这样的东西到接受的答案代码:

 [button addTarget:self action:@selector(performAction) forControlEvents:UIControlEventTouchUpInside]; 

和一个function:

 - (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的这条道路

当你在故事板中设置了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上testing。