绘制 UIButton/UIBarButtonItem 以使用父栏的 tintColor?
Posted
技术标签:
【中文标题】绘制 UIButton/UIBarButtonItem 以使用父栏的 tintColor?【英文标题】:Drawing a UIButton/UIBarButtonItem to use parent bar's tintColor? 【发布时间】:2012-12-14 22:10:03 【问题描述】:我有点进退两难。这不是破坏交易,但如果有一个像样的答案,我很感兴趣。
我一直在使用 UIButton
和 UIBarButtonItem
内的自定义子视图(作为条形按钮项目的 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,这让我离得足够近,我可以利用其余部分。这是一篇关于如何用UIColor
为UIImage
着色的详细文章;我已将其提取到一个函数中,并为 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)