¿Cómo cambiar el color de fondo de un UIButton mientras está resaltado?
En algún momento de mi aplicación tengo un elemento resaltado UIButton
(por ejemplo, cuando un usuario tiene el dedo en el botón) y necesito cambiar el color de fondo mientras el botón está resaltado (mientras el dedo del usuario todavía está en el botón). .
Intenté lo siguiente:
_button.backgroundColor = [UIColor redColor];
Pero no está funcionando. El color sigue siendo el mismo. Probé el mismo código cuando el botón no está resaltado y funciona bien. También intenté llamar -setNeedsDisplay
después de cambiar el color, pero no tuvo ningún efecto.
¿Cómo forzar que el botón cambie el color de fondo?
Puede anular UIButton
el método de setHighlighted
.
C objetivo
- (void)setHighlighted:(BOOL)highlighted {
[super setHighlighted:highlighted];
if (highlighted) {
self.backgroundColor = UIColorFromRGB(0x387038);
} else {
self.backgroundColor = UIColorFromRGB(0x5bb75b);
}
}
Rápido 3.0 y Rápido 4.1
override open var isHighlighted: Bool {
didSet {
super.isHighlighted = isHighlighted
backgroundColor = isHighlighted ? UIColor.black : UIColor.white
}
}
No estoy seguro de si esto resuelve lo que busca o si encaja con su panorama general de desarrollo, pero lo primero que intentaría sería cambiar el color de fondo del botón en el evento TouchDown.
Opción 1:
Necesitaría dos eventos para capturar, UIControlEventTouchDown sería para cuando el usuario presione el botón. UIControlEventTouchUpInside y UIControlEventTouchUpOutside serán para cuando suelten el botón volverlo al estado normal
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];
Opcion 2:
Devuelve una imagen hecha con el color de resaltado que desees. Esta también podría ser una categoría.
+ (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;
}
y luego cambie el estado resaltado del botón:
[myButton setBackgroundImage:[self imageWithColor:[UIColor greenColor]] forState:UIControlStateHighlighted];
No es necesario anularla highlighted
como propiedad calculada. Puede utilizar el observador de propiedades para activar el cambio de color de fondo:
override var highlighted: Bool {
didSet {
backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor()
}
}
veloz 4
override open var isHighlighted: Bool {
didSet {
backgroundColor = isHighlighted ? UIColor.lightGray : UIColor.white
}
}
Una práctica extensión genérica en 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)
}
}
Rápido 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)
}
}