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 我认为默认的圆角半径可能是 5.0f 而不是 4.0f。此外,人们也可能更喜欢使用 1 像素宽的图像来保持图像较小。不过这篇文章很有用,谢谢! 你有这张蓝图吗? 您应该创建一个自定义 UIView 并将其添加到 UIBarButtonItem,而不是向 UIBarButtonItem 添加 UIButton。【参考方案2】:

为什么不只是:

[[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 有颜色?

更改 UIBarButtonItem 颜色

uibarbuttonitem 高亮色调/颜色

uibarbuttonitem tint 颜色不是白色,当我将它设置为

Swift-5.0 中的 UIBarButtonItem 颜色设置

为啥我的 UIBarButtonItem 按钮在某些设备上获得背景颜色?