¿Cómo cambiar el color de fondo de un UIButton mientras está resaltado?

Resuelto MartinMoizard asked hace 54 años • 32 respuestas

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 -setNeedsDisplaydespués de cambiar el color, pero no tuvo ningún efecto.

¿Cómo forzar que el botón cambie el color de fondo?

MartinMoizard avatar Jan 01 '70 08:01 MartinMoizard
Aceptado

Puede anular UIButtonel 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
    }
}
Thomas Decaux avatar Jul 11 '2013 19:07 Thomas Decaux

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];
Tim avatar Jan 25 '2013 15:01 Tim

No es necesario anularla highlightedcomo 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
    }
}
Aleksejs Mjaliks avatar Mar 21 '2015 18:03 Aleksejs Mjaliks

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)
    }
}
Giordano Scalzo avatar Nov 23 '2014 22:11 Giordano Scalzo