如何更改UIButton突出显示的背景颜色?

在我的应用程序的某个时候,我有一个突出显示的UIButton (例如,当用户的手指在button上),我需要改变背景颜色,而button突出显示(所以当用户的手指仍然在button)。

我尝试了以下内容:

 _button.backgroundColor = [UIColor redColor]; 

但它不工作。 颜色保持不变。 当button没有突出显示时,我尝试了相同的一段代码,它工作正常。 改变颜色后,我也尝试调用-setNeedsDisplay ,但没有任何效果。

如何强制button来改变背景颜色?

不知道这种解决scheme是否符合您的总体发展前景,但我会尝试的第一件事是更改touchDown事件上button的背景颜色。

选项1:

您需要捕获两个事件,UIControlEventTouchDown将在用户按下button时使用。 UIControlEventTouchUpInside和UIControlEventTouchUpOutside将用于当他们释放button时将其返回到正常状态

 UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom]; [myButton setFrame:CGRectMake(10.0f, 10.0f, 100.0f, 20.f)]; [myButton setBackgroundColor:[UIColor blueColor]]; [myButton setTitle:@"click me:" forState:UIControlStateNormal]; [myButton setTitle:@"changed" forState:UIControlStateHighlighted]; [myButton addTarget:self action:@selector(buttonHighlight:) forControlEvents:UIControlEventTouchDown]; [myButton addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlEventTouchUpInside]; 

选项2:

返回你想要的高光颜色的图像。 这也可以是一个类别。

 + (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; } 

然后更改该button的突出显示的状态:

 [myButton setBackgroundImage:[self imageWithColor:[UIColor greenColor]] forState:UIControlStateHighlighted]; 

你可以覆盖UIButton:

 - (void) setHighlighted:(BOOL)highlighted { [super setHighlighted:highlighted]; if (highlighted) { self.backgroundColor = UIColorFromRGB(0x387038); } else { self.backgroundColor = UIColorFromRGB(0x5bb75b); } } 

Swift 3.0

 override open var isHighlighted: Bool { didSet { backgroundColor = isHighlighted ? UIColor.black : UIColor.white } } 

没有必要重写highlighted为计算属性。 您可以使用属性观察器触发背景颜色更改:

 override var highlighted: Bool { didSet { backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor() } } 

在swift中,可以覆盖突出显示(或选定)属性的访问者,而不是覆盖setHighlighted方法

 override var highlighted: Bool { get { return super.highlighted } set { if newValue { backgroundColor = UIColor.blackColor() } else { backgroundColor = UIColor.whiteColor() } super.highlighted = newValue } } 

Swift中一个方便的通用扩展:

 extension UIButton { private func imageWithColor(color: UIColor) -> UIImage { let rect = CGRectMake(0.0, 0.0, 1.0, 1.0) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() CGContextSetFillColorWithColor(context, color.CGColor) CGContextFillRect(context, rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) { self.setBackgroundImage(imageWithColor(color), forState: state) } } 

Swift 3.0

 extension UIButton { private func imageWithColor(color: UIColor) -> UIImage? { let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() context?.setFillColor(color.cgColor) context?.fill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } func setBackgroundColor(_ color: UIColor, for state: UIControlState) { self.setBackgroundImage(imageWithColor(color: color), for: state) } } 

覆盖突出显示的variables。 添加@IBInspectable使您可以编辑故事板中突出显示的backgroundColor,这也非常漂亮。

 class BackgroundHighlightedButton: UIButton { @IBInspectable var highlightedBackgroundColor :UIColor? @IBInspectable var nonHighlightedBackgroundColor :UIColor? override var highlighted :Bool { get { return super.highlighted } set { if newValue { self.backgroundColor = highlightedBackgroundColor } else { self.backgroundColor = nonHighlightedBackgroundColor } super.highlighted = newValue } } } 

一个更紧凑的解决scheme(基于@ aleksejs-mjaliks答案):

Swift 2:

 override var highlighted: Bool { didSet { backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor() } } 

Swift 3+

 override var isHighlighted: Bool { didSet { backgroundColor = isHighlighted ? UIColor.lightGray : UIColor.white } } 

这里有一个在Swift中的方法,使用UIButton扩展来添加一个名为highlightedBackgroundColor的IBInspectable。 类似于子类,不需要子类。

 private var HighlightedBackgroundColorKey = 0 private var NormalBackgroundColorKey = 0 extension UIButton { @IBInspectable var highlightedBackgroundColor: UIColor? { get { return objc_getAssociatedObject(self, &HighlightedBackgroundColorKey) as? UIColor } set(newValue) { objc_setAssociatedObject(self, &HighlightedBackgroundColorKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN)) } } private var normalBackgroundColor: UIColor? { get { return objc_getAssociatedObject(self, &NormalBackgroundColorKey) as? UIColor } set(newValue) { objc_setAssociatedObject(self, &NormalBackgroundColorKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN)) } } override public var backgroundColor: UIColor? { didSet { if !highlighted { normalBackgroundColor = backgroundColor } } } override public var highlighted: Bool { didSet { if let highlightedBackgroundColor = self.highlightedBackgroundColor { if highlighted { backgroundColor = highlightedBackgroundColor } else { backgroundColor = normalBackgroundColor } } } } } 

我希望这有帮助。

您可以使用添加方法setBackgroundColor:forState的这个类别

https://github.com/damienromito/UIButton-setBackgroundColor-forState-

Swift 3语法的UIButton扩展:

 extension UIButton { func setBackgroundColor(color: UIColor, forState: UIControlState) { UIGraphicsBeginImageContext(CGSize(width: 1, height: 1)) UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor) UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) let colorImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() self.setBackgroundImage(colorImage, for: forState) }} 

像这样使用它:

 YourButton.setBackgroundColor(color: UIColor.white, forState: .highlighted) 

原始答案: https : //stackoverflow.com/a/30604658/3659227

我最好的解决scheme,没有子类的Swift 3+

 extension UIButton { func setBackgroundColor(_ color: UIColor, for state: UIControlState) { let rect = CGRect(x: 0, y: 0, width: 1, height: 1) UIGraphicsBeginImageContext(rect.size) color.setFill() UIRectFill(rect) let colorImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() setBackgroundImage(colorImage, for: state) } } 

通过此扩展function,您可以轻松pipe理不同状态的颜色,并在未提供高亮颜色的情况下自动淡入淡出正常颜色。

 button.setBackgroundColor(.red, for: .normal) 

更新:

使用UIButtonBackgroundColor Swift库。

旧:

使用下面的助手来创build一个灰度填充颜色的1 px x 1 px图像:

 UIImage *image = ACUTilingImageGray(248/255.0, 1); 

或RGB填充颜色:

 UIImage *image = ACUTilingImageRGB(253/255.0, 123/255.0, 43/255.0, 1); 

然后,使用该image设置button的背景图像:

 [button setBackgroundImage:image forState:UIControlStateNormal]; 

助手

 #pragma mark - Helpers UIImage *ACUTilingImageGray(CGFloat gray, CGFloat alpha) { return ACUTilingImage(alpha, ^(CGContextRef context) { CGContextSetGrayFillColor(context, gray, alpha); }); } UIImage *ACUTilingImageRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha) { return ACUTilingImage(alpha, ^(CGContextRef context) { CGContextSetRGBFillColor(context, red, green, blue, alpha); }); } UIImage *ACUTilingImage(CGFloat alpha, void (^setFillColor)(CGContextRef context)) { CGRect rect = CGRectMake(0, 0, 0.5, 0.5); UIGraphicsBeginImageContextWithOptions(rect.size, alpha == 1, 0); CGContextRef context = UIGraphicsGetCurrentContext(); setFillColor(context); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

注意: ACU是我的Cocoa Touch静态库名为Acani Utilities的类前缀,AC是Acani,U是Utilities。

尝试这个 !!!!

对于TouchedDown事件设置一种颜色和TouchUpInside设置另一种颜色。

 - (IBAction)touchedDown:(id)sender { NSLog(@"Touched Down"); btn1.backgroundColor=[UIColor redColor]; } - (IBAction)touchUpInside:(id)sender { NSLog(@"TouchUpInside"); btn1.backgroundColor=[UIColor whiteColor]; } 

子类的UIButton和添加可检查的属性,方便使用(写在Swift 3.0中):

 final class SelectableBackgroundButton: UIButton { private struct Constants { static let animationDuration: NSTimeInterval = 0.1 } @IBInspectable var animatedColorChange: Bool = true @IBInspectable var selectedBgColor: UIColor = UIColor.blackColor().colorWithAlphaComponent(0.2) @IBInspectable var normalBgColor: UIColor = UIColor.clearColor() override var selected: Bool { didSet { if animatedColorChange { UIView.animateWithDuration(Constants.animationDuration) { self.backgroundColor = self.selected ? self.selectedBgColor : self.normalBgColor } } else { self.backgroundColor = selected ? selectedBgColor : normalBgColor } } } override var highlighted: Bool { didSet { if animatedColorChange { UIView.animateWithDuration(Constants.animationDuration) { self.backgroundColor = self.highlighted ? self.selectedBgColor : self.normalBgColor } } else { self.backgroundColor = highlighted ? selectedBgColor : normalBgColor } } } } 

试试这个,如果你有一个图像:

 -(void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state; 

或者看看showsTouchWhenHighlighted是否足够。

你可以inheritanceUIButton并且创build一个很好的状态。

colourButton.h

 #import <UIKit/UIKit.h> @interface colourButton : UIButton -(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state; @end 

colourButton.m

 #import "colourButton.h" @implementation colourButton { NSMutableDictionary *colours; } -(id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; // If colours does not exist if(!colours) { colours = [NSMutableDictionary new]; // The dictionary is used to store the colour, the key is a text version of the ENUM colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]] = (UIColor*)self.backgroundColor; // Store the original background colour } return self; } -(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state { // If it is normal then set the standard background here if(state & UIControlStateNormal) { [super setBackgroundColor:backgroundColor]; } // Store the background colour for that state colours[[NSString stringWithFormat:@"%lu", state]]= backgroundColor; } -(void)setHighlighted:(BOOL)highlighted { // Do original Highlight [super setHighlighted:highlighted]; // Highlight with new colour OR replace with orignial if (highlighted && colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]]) { self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]]; } else { self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]]; } } -(void)setSelected:(BOOL)selected { // Do original Selected [super setSelected:selected]; // Select with new colour OR replace with orignial if (selected && colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]]) { self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]]; } else { self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]]; } } @end 

笔记 (这是一个例子,我知道有问题,这里有一些)

我已经使用NSMutableDictionay来存储每个国家的UIColor,我不得不做一个危险的文本转换的密钥,因为UIControlState不是一个不错的直Int。 如果它可以在哪里启动一个包含多个对象的数组,并使用该状态作为索引。

正因为如此,许多人在select和禁用button方面都有困难,需要更多的逻辑。

另一个问题是,如果您尝试同时设置多种颜色,我没有尝试过使用button,但是如果您可以这样做,则可能无法使用

  [btn setBackgroundColor:colour forState:UIControlStateSelected & UIControlStateHighlighted]; 

我假设这是StoryBoard,没有init,initWithFrame所以添加他们,如果你需要他们。

我已经开源了一个UIButton子类STAButton ,来填补这个空洞的function漏洞。 根据MIT许可证提供。 适用于iOS 7+(我还没有使用旧的iOS版本进行testing)。

为了解决这个问题,我创build了一个类来处理与UIButtons backgroundColor
ButtonBackgroundColor-IOS

您可以将该类别安装为一个窗格 。

易于与Objective-C一起使用

 @property (nonatomic, strong) UIButton *myButton; ... [self.myButton bbc_backgroundColorNormal:[UIColor redColor] backgroundColorSelected:[UIColor blueColor]]; 

更易于使用Swift

 import ButtonBackgroundColor ... let myButton:UIButton = UIButton(type:.Custom) myButton.bbc_backgroundColorNormal(UIColor.redColor(), backgroundColorSelected: UIColor.blueColor()) 

我build议你导入的豆荚:

 platform :ios, '8.0' use_frameworks! pod 'ButtonBackgroundColor', '~> 1.0' 

使用use_frameworks! 在你的Podfile中,使用Swift和objective-C更容易使用你的豆荚。

重要

我还写了一篇博客文章,提供更多信息。

尝试tintColor

 _button.tintColor = [UIColor redColor]; 

这里是Swift中的代码来selectbutton状态:

 func imageWithColor(color:UIColor) -> UIImage { let rect:CGRect = CGRectMake(0.0, 0.0, 1.0, 1.0) UIGraphicsBeginImageContext(rect.size) let context:CGContextRef = UIGraphicsGetCurrentContext()! CGContextSetFillColorWithColor(context, color.CGColor) CGContextFillRect(context, rect) let image:UIImage = UIGraphicsGetImageFromCurrentImageContext(); return image; } 

例:

  self.button.setImage(self.imageWithColor(UIColor.blackColor()), forState: .Highlighted) 

如果你不会覆盖,只需设置两个动作touchDown touchUpInside

把它放进去,你很好走:
*可以在IB中设置proerty,如果没有设置高亮显示的背景,按下后不会改变背景

 private var highlightedBackgroundColors = [UIButton:UIColor]() private var unhighlightedBackgroundColors = [UIButton:UIColor]() extension UIButton { @IBInspectable var highlightedBackgroundColor: UIColor? { get { return highlightedBackgroundColors[self] } set { highlightedBackgroundColors[self] = newValue } } override open var backgroundColor: UIColor? { get { return super.backgroundColor } set { unhighlightedBackgroundColors[self] = newValue super.backgroundColor = newValue } } override open var isHighlighted: Bool { get { return super.isHighlighted } set { if highlightedBackgroundColor != nil { super.backgroundColor = newValue ? highlightedBackgroundColor : unhighlightedBackgroundColors[self] } super.isHighlighted = newValue } } } 
 extension UIImage { static func imageWithColor(tintColor: UIColor) -> UIImage { let rect = CGRect(x: 0, y: 0, width: 1, height: 1) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0) tintColor.setFill() UIRectFill(rect) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return image } 

}

  setupButton.setBackgroundImage(UIImage.imageWithColor(tintColor: UIColor(displayP3Red: 232/255, green: 130/255, blue: 121/255, alpha: 1.0)), for: UIControlState.highlighted) setupButton.setBackgroundImage(UIImage.imageWithColor(tintColor: UIColor(displayP3Red: 255/255, green: 194/255, blue: 190/255, alpha: 1.0)), for: UIControlState.normal) 

Swift 3:

 extension UIButton { private func imageWithColor(color: UIColor) -> UIImage { let rect = CGRect(x:0.0,y:0.0,width: 1.0,height: 1.0) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() context!.setFillColor(color.cgColor) context!.fill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) { self.setBackgroundImage(imageWithColor(color: color), for: state) } } 

它工作正常与迅速3更改button背景和点击button标题颜色:

  @IBAction func btnColorChange(_ sender: UIButton) { sender.backgroundColor = .red sender.setTitleColor(.white, for: .normal) } 

可以通过XIB进行设置。 在xib设置突出的色调颜色作为你的愿望,而按下button。 由于目前还没有编程的正确方法。 所以通过在XIB中设置它很容易。

它会正常工作:)享受..