如何更改UIButton的高亮颜色?

40

我在我的UINavigationController中创建了一个导航按钮。 我设置它在被点击时会高亮显示:

[someButton setShowsTouchWhenHighlighted:YES];

有没有办法将突出显示的颜色更改为除默认白色以外的其他颜色?


1
你想要改变背景颜色还是文字颜色? - Greg
当高亮时替换背景颜色... - Code Monkey
8个回答

49
尝试用以下方法覆盖UIButton,并在其高亮状态下仅更改按钮的背景颜色。
- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];

    if (highlighted) {
        self.backgroundColor = [UIColor Your Customcolor];
    }
    else{
        self.backgroundColor = [UIColor Your DefaultColor];
    }   

}

试试看...希望有所帮助


1
这很好,但我建议在按钮未被突出显示时也重置背景颜色。 - Brian Sachetta
4
self.backgroundColor = highlighted ? [UIColor darkGrayColor] : [UIColor blueColor]; - Brian Sachetta

48
你可以使用setBackgroundImage:forState:来设置按钮在高亮时的背景图像。
例如,正如Tim在这里所建议的那样,你可以从UIColor创建一个UIImage:
- (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

1
是的,这确实是在不覆盖控件的情况下更改突出显示背景颜色的唯一方法。 - Leslie Godwin
https://dev59.com/-2Uq5IYBdhLWcg3waPpC#14525049 - Clement Prem
1
看起来你是从 @ClementPrem 的链接中复制的... 这个问题应该被标记为重复,但即使在最坏的情况下,也不会伤害到所有者,给予他们一些信用。 - Claudio Redi

24

Swift中:

import UIKit

class CustomUIButtonForUIToolbar: UIButton {

    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
        super.drawRect(rect)

        self.layer.borderColor = UIColor.blueColor().CGColor
        self.layer.borderWidth = 1.0
        self.layer.cornerRadius = 5.0
        self.clipsToBounds = true
        self.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)

        self.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
    }

    override var highlighted: Bool {
        didSet {

            if (highlighted) {
                self.backgroundColor = UIColor.blueColor()
            }
            else {
                self.backgroundColor = UIColor.clearColor()
            }

        }
    }

}

4
请注意,drawRect 中没有任何代码应该在其中。 drawRect 用于绘制图形上下文。个人建议将这些代码放入 awakeFromNib 中,但 init?(coder:) 也可以使用。 - Christopher Swasey

5
我将提供一个Swift答案,如果你希望高亮颜色是原始背景颜色的加深版本,则可以直接使用,无需进行任何自定义。另一方面,如果你想要完全不同的高亮背景色,可以将其作为UIColor提供给highlightedBackgroundColor属性。
以下是在Swift中实现这种功能最有效且直接的方法。它还是通用的,意味着可以用于许多具有不同颜色的不同按钮。 下面是代码:
import UIKit

class HighlightedColorButton: UIButton {

    // A new highlightedBackgroundColor, which shows on tap
    var highlightedBackgroundColor: UIColor?
    // A temporary background color property, which stores the original color while the button is highlighted
    var temporaryBackgroundColor: UIColor?


    // Darken a color
    func darkenColor(color: UIColor) -> UIColor {

        var red = CGFloat(), green = CGFloat(), blue = CGFloat(), alpha = CGFloat()

        color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        red = max(red - 0.5, 0.0)
        green = max(green - 0.5, 0.0)
        blue = max(blue - 0.5, 0.0)

        return UIColor(red: red, green: green, blue: blue, alpha: alpha)
    }


    // Set up a property observer for the highlighted property, so the color can be changed
    @objc override var highlighted: Bool {
        didSet {
            if highlighted {
                if temporaryBackgroundColor == nil {
                    if backgroundColor != nil {
                        if let highlightedColor = highlightedBackgroundColor {
                            temporaryBackgroundColor = backgroundColor
                            backgroundColor = highlightedColor
                        } else {
                            temporaryBackgroundColor = backgroundColor
                            backgroundColor = darkenColor(temporaryBackgroundColor!)
                        }
                    }
                }
            } else {
                if let temporaryColor = temporaryBackgroundColor {
                    backgroundColor = temporaryColor
                    temporaryBackgroundColor = nil
                }
            }
        }
    }
}

将按钮视为普通的UIButton,除了可以选择使用highlightedBackgroundColor属性:

let highlightedColorButton = HighlightedColorButton.buttonWithType(.Custom) as HighlightedColorButton
highlightedColorButton.backgroundColor = UIColor.redColor()
highlightedColorButton.highlightedBackgroundColor = UIColor.blueColor()

3
使用此语句来设置UIButton的高亮颜色:
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];

1
在Swift中,如果您想为高亮状态使用图像,则可以使用UIButton来实现:
if enabled {
 //highlighted state
     enableMicrophone.setImage(UIImage(named: "mic_on"), forState: .Highlighted)
 } else {
 //normal state
     enableMicrophone.setImage(UIImage(named: "mic_off"), forState: .Normal)    
}

1

对于 Swift

import UIKit

extension UIImage {

func imageWithAlphaComponent(alpha: CGFloat) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.size, false, 0)

    let ctx = UIGraphicsGetCurrentContext()
    let area = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)

    CGContextScaleCTM(ctx, 1, -1)
    CGContextTranslateCTM(ctx, 0, -area.size.height)

    CGContextSetBlendMode(ctx, CGBlendMode.Multiply)

    CGContextSetAlpha(ctx, alpha)

    CGContextDrawImage(ctx, area, self.CGImage)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return newImage
}
}

写入。
button.setImage(image.imageWithAlphaComponent(0.65), forState: .Highlighted)

https://gist.github.com/yukitoto/e8aa420e20be7ab5d64b71e96ecd61f1


0

我正在使用一种古老的网页技巧,取得了一些成功。

我在images.xcassets中创建了几个图像资源,PNG文件,都是1像素乘1像素。其中一个是正常颜色,另一个是背景颜色。

我从纯黑色到纯白色,所以:

在Storyboard中选择按钮。在“属性检查器”(右侧面板,第4个图标)中,将类型更改为“自定义”,将“状态配置”更改为“高亮显示”,然后将“背景”更改为“whitePixel”(或任何您称之为的名称),将“文本颜色”更改为“黑色”。

现在将“状态配置”更改为“默认”,将“背景”更改为“blackPixel”(或其他名称),将“文本颜色”更改为“白色”。

我想你可以在需要应用颜色但只能访问Storyboard编辑器中的图像时使用这些像素。

这确实增加了图像资源的数量,但大大减少了所需的代码。这让我很高兴。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接