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是:
为什么不只是:
[[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
。 然后你可以添加你想要的任何其他控件,例如UIButton
, UILabel
, UIActivityIndicatorView
。
我想添加一些东西到突出显示的解决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。