绘制 UIButton/UIBarButtonItem 以使用父栏的 tintColor?

Posted

技术标签:

【中文标题】绘制 UIButton/UIBarButtonItem 以使用父栏的 tintColor?【英文标题】:Drawing a UIButton/UIBarButtonItem to use parent bar's tintColor? 【发布时间】:2012-12-14 22:10:03 【问题描述】:

我有点进退两难。这不是破坏交易,但如果有一个像样的答案,我很感兴趣。

我一直在使用 UIButtonUIBarButtonItem 内的自定义子视图(作为条形按钮项目的 customView)。我的自定义子视图不是UILabel 也不是UIImage,这就是我正在做我正在做的事情的原因。这个UIBarButtonItem 是我导航栏上的一个项目,导航栏有一个tintColor 集。我希望UIButton 具有UIBarButtonItemStyleBordered 的圆角矩形外观,这意味着它还应该采用其父栏的tintColor

目前的解决方案已经实现了从 UIKit 中为 UINavigationBarDefaultButton.png 和家庭提取 png 文件。如果我没有设置 tintColor 属性,这看起来会很棒;相反,当我想要亮橙色(不是我使用的颜色,但你明白我的意思)时,按钮仍然是“ios 海军蓝”。这让我陷入了两难境地:让 UIButton 的外观和行为类似于 UIBarButtonItem 样式的最佳方法是什么,包括采用 tintColor 属性?我可以自己在按钮上设置该属性;没什么大不了的。

我想在 CoreGraphics 中绘制 UIButton 的背景吗?是否有一个框架/库已经实现了这个?如果我在做不可能的梦,请告诉我。我对手工制作 CoreGraphics 还不是很厉害,但它绝对不在可能的范围之外。

如果无法做到这一点,我知道我总是可以使用很酷的自定义 UIView 我正在尝试修改并将其保存为图像(因此在 @987654340 中使用 UIImage @),但我想看看这是否可能。

这就是我正在处理的(下)。后退按钮看起来很棒,但这只是因为我没有弄乱它。我希望rightBarButtonItem 使用我设置的tintColor,但是为了给UIBarButtonItemStyleBordered 外观加上customView 设置,我不得不让按钮使用png 文件因为它的背景。下面是您看到的内容,即使在 UIBarButtonItem 上设置了 tintColor(因为它使用的是 png)。

【问题讨论】:

请致电[super tintColor] [super tintColor] 似乎不起作用;查看我的修改。 【参考方案1】:

我确实在 Stack Overflow 上找到了 this question/answer,这让我离得足够近,我可以利用其余部分。这是一篇关于如何用UIColorUIImage 着色的详细文章;我已将其提取到一个函数中,并为 right here 发布了一个要点。

结合这一点,我在UIButton 上定义了一个类别方法,它允许我创建一个带有该背景图像的按钮,着色,然后我将它放入一个空的UIBarButtonItem

+ (id)buttonWithBarStyleAndTintColor:(UIColor *)tintColor customView:(UIView *)customView 
    UIImage *defaultNormal = [UIImage imageNamed:@"UINavigationBarDefaultButton.png"];
    UIImage *defaultPressed = [UIImage imageNamed:@"UINavigationBarDefaultButtonPressed.png"];
    UIImage *back = [TintImageWithTintColor(defaultNormal, tintColor)
                     stretchableImageWithLeftCapWidth:5.0
                     topCapHeight:0.0];
    UIImage *pressed = [TintImageWithTintColor(defaultPressed, tintColor)
                        stretchableImageWithLeftCapWidth:5.0
                        topCapHeight:0.0];

    UIButton *button = [self buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, 34.0f, 30.0f);
    [button addSubview:customView];
    customView.userInteractionEnabled = NO;
    customView.frame = CGRectCenterRectInRect(customView.frame, button.frame);
    [button setBackgroundImage:back forState:UIControlStateNormal];
    [button setBackgroundImage:pressed forState:UIControlStateSelected];
    [button setBackgroundImage:pressed forState:UIControlStateHighlighted];
    return button;

【讨论】:

【参考方案2】:

您可以尝试将 UIButton 类型设置为自定义,并确保其颜色清晰,与您的自定义视图相同,这样唯一可见的视图将是 UIBarButtonItem 色调。

此外,如果您愿意投资,还有一个名为 PaintCode 的工具可以为您编写 CoreGraphics 的代码。

【讨论】:

我可以试试 PaintCode,看起来很流畅。不过,您的回答对我没有多大帮助,因为确保我的按钮和自定义视图具有清晰的背景并在我的 UIBarButtonItem 上设置色调颜色只是在工具栏上单独显示我的自定义视图(地球),而不是周围的铬。

以上是关于绘制 UIButton/UIBarButtonItem 以使用父栏的 tintColor?的主要内容,如果未能解决你的问题,请参考以下文章

使用shader绘制线线段曲线(WebGL-Shader开发基础01)

使用shader绘制线线段曲线(WebGL-Shader开发基础01)

canvas(四) 绘制文字

Canvas---绘制饼状图

pyplot绘制常见图表

OpenCV图像处理3绘制基本图形