UIButton deshabilitado no descolorido o gris

135

En mi aplicación para iPhone, tengo un UIButton que he creado en Interface Builder. Puedo habilitarlo y deshabilitarlo con éxito de esta manera en mi código ...

sendButton.enabled = YES;

o

sendButton.enabled = NO;

Sin embargo, ¡el aspecto visual del botón es siempre el mismo! No está descolorido ni gris. Sin embargo, si intento hacer clic en él, se activa o desactiva como se esperaba. ¿Me estoy perdiendo de algo? ¿No debería verse desvaído o gris?

Andy A
fuente
¿Estás usando la imagen con tu UIButton?
Jhaliya
No, no lo hace, tendrá que establecer su alfa, en consecuencia, funcionará.
Ravin el

Respuestas:

187

Puedes usar el siguiente código:

sendButton.enabled = YES;
sendButton.alpha = 1.0;

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;
Presa
fuente
12
Si bien esto funciona, considero que las soluciones que cambian el aspecto dependiendo del estado de control como este y esto desde abajo son una idea mucho mejor. Están utilizando el mecanismo incorporado para lograr un cambio automático, en lugar de tener que actualizar explícitamente el aspecto del control dependiendo de su estado.
Benjohn
78

simplemente cambie la configuración de estado para deshabilitar y elija lo que desee, Imagen de fondo para estado deshabilitado

ingrese la descripción de la imagen aquí

Ahmed R.
fuente
13
Esto solo cambia las propiedades en el subtítulo del botón . El color de fondo está debajo del subtítulo Ver , por lo que no se cambia por las configuraciones de estado.
Hunter Monk el
2
Esto no funciona para el color de fondo de la vista. En mi proyecto combiné la respuesta anterior y esta.
Anton
40

Otra opción es cambiar el color del texto (a gris claro, por ejemplo) para el estado deshabilitado.

En el editor del guión gráfico, elija Disableddel State Configbotón emergente. Use el Text Colorbotón emergente para cambiar el color del texto.

En código, usa el -setTitleColor:forState:mensaje.

guywithmazda
fuente
Esto parece una solución mucho mejor que la respuesta exceptuada de ajustar el alfa. Ya voté por esto hace meses y ahora estoy de vuelta aquí con el mismo problema, ¡ojalá pudiera volver a hacerlo!
Benjohn
Sí, parece ser una solución de trabajo. Solo uso el color gris claro.
atereshkov
23

Intente configurar las diferentes imágenes para UIControlStateDisabled(imagen gris deshabilitada) y UIControlStateNormal(Imagen normal) para que el botón genere el estado deshabilitado por usted.

Jhaliya
fuente
2
él no está usando imágenes, pero podrías aplicar este mismo concepto [ UIButton setAttributedTitle:forState:]. Cree su cadena atribuida donde el color de primer plano del texto se establezca en un color transparente.
nielsbot
20

Para hacer que el botón se desvanezca cuando se deshabilita, puede configurar alfa para él. Hay dos opciones para ti:

Primera forma : si desea solicitar todos sus botones en su aplicación, puede escribir extensionpara UIButton de esta manera:

extension UIButton {

    open override var isEnabled: Bool{
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }

}

Segunda forma : si solo desea solicitar algunos botones en su aplicación, puede escribir una clase personalizada desde UIButton como se muestra a continuación y usar esta clase para la que desea aplicar:

class MyButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }
}
Heo Đất Hades
fuente
13

Si usa un botón de texto, puede poner en viewDidLoad el método de instancia

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state

ejemplo:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
Antonio Moro
fuente
1
Esta debería ser la respuesta aceptada para un botón de texto. La respuesta aceptada actual es buena para un botón de imagen. Lo que obtengo de los comentarios de op es que tiene un botón de texto ...
Ali Hus
11

Puedes usar adjustsImageWhenDisabledcual es propiedad deUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Ex:

 Button.adjustsImageWhenDisabled = false
Mahesh Lad
fuente
2
Que hace eso ¿Puedes explicar por qué debería usar eso?
Zippy
7

Esta es una pregunta bastante antigua, pero hay una forma muy simple de lograrlo.

myButton.userInteractionEnabled = false

Esto solo deshabilitará cualquier gesto táctil sin cambiar la apariencia del botón

Diego A. Rincón
fuente
5

En Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

o

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
Rey Mago
fuente
5

Establecido title colorpara diferentes estados:

@IBOutlet weak var loginButton: UIButton! {
        didSet {
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 0.3), for: .disabled)
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 1), for: .normal)
        }
    }

Uso: (el color del texto cambiará automáticamente)

loginButton.isEnabled = false

ingrese la descripción de la imagen aquí

Kiran S
fuente
3

Cree una extensión en Swift> 3.0 en lugar de cada botón por sí mismo

extension UIButton {
    override open var isEnabled : Bool {
        willSet{
            if newValue == false {
                self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
            }
        }
    }
}
ios mentalista
fuente
3

Puede usar las dos primeras respuestas y será un mejor resultado.

En el inspector de atributos (cuando selecciona el botón), cambie la Configuración de estado a Desactivada para establecer la nueva imagen que aparecerá cuando esté desactivada (elimine el marcador en la verificación Contenido-> Activado para desactivarla) .

Y cuando cambia el estado a habilitado, la imagen cargará la de este estado.

Agregar la lógica alfa a esto es un buen detalle.

ChavirA
fuente
3

Swift 4+

extension UIButton {
    override open var isEnabled: Bool {
        didSet {
            DispatchQueue.main.async {
                if self.isEnabled {
                    self.alpha = 1.0
                }
                else {
                    self.alpha = 0.6
                }
            }
        }
    }
}

Cómo utilizar

myButton.isEnabled = false
Latif Rashid
fuente
2

Estoy atrapado en el mismo problema. Establecer alfa no es lo que quiero.

UIButtontiene " imagen de fondo " y " color de fondo ". Por imagen, UIButtontiene una propiedad como

@property (nonatomic) BOOL adjustsImageWhenDisabled

Y la imagen de fondo se dibuja más clara cuando el botón está desactivado. Para el color de fondo, la configuración alfa, la solución de Ravin, funciona bien.

Primero, debe verificar si ha desmarcado el cuadro "deshabilitar ajusta imagen" en Utilidades-Atributos.
Luego, verifique el color de fondo de este botón.

(Espero que sea útil. Esta es una publicación antigua; las cosas podrían haber cambiado en Xcode).

Yichao Lu
fuente
1

Parece que el siguiente código funciona bien. Pero en algunos casos, esto no funciona.

sendButton.enabled = NO;
sendButton.alpha = 0.5;

Si el código anterior no funciona, envuélvalo en Hilo principal. entonces

dispatch_async(dispatch_get_main_queue(), ^{
    sendButton.enabled = NO;
    sendButton.alpha = 0.5
});

si vas con rapidez, así

DispatchQueue.main.async {
    sendButton.isEnabled = false
    sendButton.alpha = 0.5
}

Además, si personalizó UIButton, agréguelo a la clase Button.

override var isEnabled: Bool {
    didSet {
        DispatchQueue.main.async {
            if self.isEnabled {
                self.alpha = 1.0
            }
            else {
                self.alpha = 0.5
            }
        }
    }
}

Gracias y disfruta codificando !!!

Li Jin
fuente
1

Si el UIButtonestá en el estado combinado de selectedy disabled, su estado es UIControlStateSelected | UIControlStateDisabled.

Por lo tanto, su estado debe ajustarse así:

[button setTitleColor:color UIControlStateSelected | UIControlStateDisabled];
[button setImage:image forState:UIControlStateSelected | UIControlStateDisabled];

Un enfoque es subclasificar de la UIButtonsiguiente manera:

@implementation TTButton
- (void)awakeFromNib {
   [super awakeFromNib];

    //! Fix behavior when `disabled && selected`
    //! Load settings in `xib` or `storyboard`, and apply it again.
    UIColor *color = [self titleColorForState:UIControlStateDisabled];
    [self setTitleColor:color forState:UIControlStateDisabled];

    UIImage *img = [self imageForState:UIControlStateDisabled];
    [self setImage:img forState:UIControlStateDisabled];
}

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
    [super setTitleColor:color forState:state];

    //
    if (UIControlStateDisabled == state) {
        [super setTitleColor:color forState:UIControlStateSelected | state];
        [super setTitleColor:color forState:UIControlStateHighlighted | state];
    }
}

- (void)setImage:(UIImage *)image forState:(UIControlState)state {
    [super setImage:image forState:state];

    if (UIControlStateDisabled == state) {
        [super setImage:image forState:UIControlStateSelected | state];
        [super setImage:image forState:UIControlStateHighlighted | state];
    }
}

@end
AechoLiu
fuente
1
Esta debería ser la respuesta aceptada. En Swift, necesitará algo como setTitleColor (disabledColor, para: [.disabled, .selected])
Paulo Cesar
0

Esta pregunta tiene muchas respuestas, pero todas no parecen muy útiles en caso de que realmente quiera usar backgroundColor para diseñar sus botones. UIButton tiene una buena opción para configurar diferentes imágenes para diferentes estados de control, pero no hay la misma función para los colores de fondo. Entonces, una de las soluciones es agregar una extensión que generará imágenes a partir del color y aplicarlas al botón.

extension UIButton {
  private func image(withColor 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(image(withColor: color), for: state)
  }
}

Solo hay un problema con esta solución: este cambio no se aplicará a los botones creados en el guión gráfico. En cuanto a mí, no es un problema porque prefiero diseñar la interfaz de usuario desde el código. Si desea usar guiones gráficos, entonces @IBInspectablenecesita algo de magia adicional .

La segunda opción es la subclasificación, pero prefiero evitar esto.

oroom
fuente
0

Tal vez pueda subclasificar su botón y anular su variable isEnabled. La ventaja es que puede reutilizar en múltiples lugares.

override var isEnabled: Bool {
     didSet {
         if isEnabled {
             self.alpha = 1
         } else {
             self.alpha = 0.2
         }
     }
 }
Jay Mayu
fuente
-1
#import "UIButton+My.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIButton (My)


-(void)fade :(BOOL)enable{
    self.enabled=enable;//
    self.alpha=enable?1.0:0.5;
}

@end

.h:

#import <UIKit/UIKit.h>
@interface UIButton (My)

-(void)fade :(BOOL)enable;

@end

fuente
2
Alguna descripción que acompañe a su código sería una mejor respuesta.
Phantômaxx