UIBarButtonItem 有颜色?
Posted
技术标签:
【中文标题】UIBarButtonItem 有颜色?【英文标题】:UIBarButtonItem with color? 【发布时间】:2009-03-20 03:55:00 【问题描述】:是否可以有一个红色的 UIBarButtonItem?
【问题讨论】:
【参考方案1】:如果有人正在寻找完全复制简单 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 是:
【讨论】:
附加说明:您需要将 QuartzCore 库添加到您的项目中并将其导入您的类中以使用 CALayer 方法。 为了避免其他人不得不查找它:#import为什么不只是:
[[self editButtonItem] setTintColor:[UIColor redColor]];
(在 sdk 4.* 、ios 5 及更高版本上)
【讨论】:
正是需要的。谢谢。 斯威夫特 3:barButtonItem.tintColor = .red
【参考方案3】:
您可以创建具有所需外观的自定义 UIButton,并将您的 UIBarButtonItem 初始化为自定义视图。
UIButton *button = [UIButton buttonWithType:....];
...(customize your button)...
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];
【讨论】:
但这并没有给你一个匹配 iOS 默认渲染的 UIBarButtonItem,除非你愿意像 Scott 那样煞费苦心地复制 iOS 默认渲染行为。但是,如果您想摆脱默认外观,那么这显然是要走的路。【参考方案4】:您可以在 iOS 5 中设置 UIBarButtonItem 的 tintColor 属性。如果您需要支持 iOS 4,请查看this blog post。它使用 UISegmentedControl 进行了详细说明,该控件的样式看起来像单个按钮。
【讨论】:
【参考方案5】:使用自定义图像不起作用,因为它只是使用 alpha 来呈现按钮。
【讨论】:
【参考方案6】:好的,在我看来,实际上有一个更好的解决方案,它涉及更少的代码并使用本机 UI 控件。
诀窍是使用 UISegmentedControl,并删除除一个之外的所有段。 (不能在 IB 中完成,必须以编程方式完成)。
完成后,设置色调颜色,然后创建一个 UIBarButtonItem,将 UISegmentedControl 作为自定义视图传递给它。
这个人使用该技术创建了一个 UIBarButtonItem 类别,效果非常好:
http://fredandrandall.com/blog/2011/03/31/how-to-change-the-color-of-a-uibarbuttonitem/
【讨论】:
如果你必须像我一样支持 4.3,这是个好建议。我将使用链接中详细说明的类别。【参考方案7】:您可以为按钮创建自定义图像并使用它。否则,如果您将导航栏或工具栏的 tintColor 设置为红色,则这些上的按钮项也将显示为红色。
【讨论】:
【参考方案8】:如果是 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];
【讨论】:
【参考方案9】:如果使用 IB (Interface Builder),将 UIView
从库中拖到 UIToolBar
上,它将生成带有自定义视图的 UIBarButtonItem
。然后,您可以添加任何其他您想要的控件,例如UIButton
, UILabel
, UIActivityIndicatorView
.
【讨论】:
【参考方案10】:我想在突出显示的解决方案中添加一些内容。如果您执行此子类化,它将不会执行分配给 UIBarButtonItem 的故事板定义的 segue 和选择器。此外,UIBarButtonItem 中未设置“目标”和“操作”属性,因此您无法从子类访问它们并将它们分配给您的 UIButton。
我通过向我的子类(使用 ARC)添加 2 个属性来解决这个问题:
@property (nonatomic, weak) id targetViewController;
@property (nonatomic, strong) NSString *segueIdentifier;
接下来,在您的子类的 init 中,将这样的内容添加到接受的答案代码中:
[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;
希望这有助于其他人在开始使用 Storyboards/iOS5 时节省时间
【讨论】:
【参考方案11】:当您在 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 上测试。
【讨论】:
以上是关于UIBarButtonItem 有颜色?的主要内容,如果未能解决你的问题,请参考以下文章
uibarbuttonitem tint 颜色不是白色,当我将它设置为