web-dev-qa-db-fra.com

UIB désactivé, pas fané ou gris

Dans mon application iPhone, j'ai un UIButton que j'ai créé dans Interface Builder. Je peux avec succès l'activer et le désactiver comme ceci dans mon code ...

sendButton.enabled = YES;

ou

sendButton.enabled = NO;

Cependant, l'aspect visuel du bouton est toujours le même! Ce n'est pas fané ou gris. Si je tente de cliquer dessus, il est activé ou désactivé comme prévu. Est-ce que je manque quelque chose? Ne devrait-il pas sembler fané ou gris?

merci

105
Andy A

Vous pouvez utiliser le code suivant: 

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

or

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

il suffit de changer la configuration d'état pour désactiver et choisir ce que vous voulez, Image d'arrière-plan pour l'état désactivé

 enter image description here

62
Ahmed R.

Une autre option consiste à modifier la couleur du texte (en gris clair par exemple) pour l’état désactivé. Dans l'éditeur de story-board, sélectionnez Désactivé dans le bouton contextuel Config d'état et utilisez le bouton contextuel Couleur du texte pour modifier la couleur du texte. Dans le code, utilisez le message -setTitleColor: forState:.

(Je réalise que c'est un ancien billet, mais je pensais que d'autres pourraient aimer cette option)

31
guywithmazda

Essayez de définir les différentes images pour UIControlStateDisabled (image grise désactivée) et UIControlStateNormal (image normale) afin que le bouton génère l'état désactivé pour vous.

23
Jhaliya

Vous pouvez utiliser adjustsImageWhenDisabled qui est la propriété de UIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Ex:

 Button.adjustsImageWhenDisabled = false
10
Mahesh Lad

Si vous utilisez un bouton de texte, vous pouvez mettre dans viewDidLoad la méthode d'instance

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

exemple:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
9
Antonio Moro

Pour rendre le bouton estompé lorsqu'il est désactivé, vous pouvez définir alpha pour lui. Il y a deux options pour vous:

Première manière : Si vous souhaitez appliquer tous vos boutons dans votre application, vous pouvez écrire extension pour UIButton comme ceci:

extension UIButton {

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

}

Deuxième manière : Si vous souhaitez simplement appliquer des boutons à votre application, vous pouvez écrire une classe personnalisée à partir d'UIButton comme ci-dessous et utiliser cette classe pour laquelle vous souhaitez appliquer:

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

C'est une question assez ancienne mais il existe un moyen très simple d'y parvenir.

myButton.userInteractionEnabled = false

Cela ne fera que désactiver les gestes tactiles sans changer l'apparence du bouton

5
Diego A. Rincon

Dans Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

ou

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
4
King-Wizard

Vous pouvez utiliser les deux premières réponses et le résultat sera meilleur. 

Dans l'inspecteur d'attributs (lorsque vous sélectionnez le bouton), définissez la configuration de l'état sur Désactivé afin de définir la nouvelle image qui va apparaître lorsqu'elle est désactivée (supprimez le marqueur de la vérification Contenu-> Activé pour le désactiver) . 

Et lorsque vous activez l'état, l'image se chargera à partir de cet état. 

Ajouter la logique alpha à ceci est un bon détail. 

Salutations!

3
ChavirA

Créez une extension dans Swift> 3.0 plutôt que chaque bouton seul

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

Définissez title color pour différents états:

@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)
        }
    }

Utilisation: (la couleur du texte sera modifiée automatiquement)

loginButton.isEnabled = false

 enter image description here

1
Kiran S

Si UIButton est dans l'état combiné avec selected et disabled, il est UIControlStateSelected | UIControlStateDisabled.

Donc, il faut que l'état s'ajuste en

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

Une approche est la sous-classe UIButton comme suit.

@implementation TTButton
- (void)awaeFromNib {
   [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
1
AechoLiu

Il semble que le code suivant fonctionne bien. Mais dans certains cas, cela ne fonctionne pas.

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

Si le code ci-dessus ne fonctionne pas, veuillez l'envelopper dans le fil principal. alors

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

si tu vas avec Swift, comme ça

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

De plus, si vous avez personnalisé UIButton, ajoutez-le à la classe Button.

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

Merci et bon codage !!!

1
Li Jin

Cette question a beaucoup de réponses mais elles n’ont pas l’air très utiles si vous voulez vraiment utiliser backgroundColor pour styler vos boutons . UIButton a la possibilité de définir différentes images pour différents états de contrôle couleurs de fond . Une des solutions consiste donc à ajouter une extension qui générera des images à partir de la couleur et les appliquera au bouton.

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)
  }
}

Un seul problème avec cette solution: cette modification ne sera pas appliquée aux boutons créés dans le storyboard. En ce qui me concerne, ce n’est pas un problème car je préfère créer une interface utilisateur à partir de code. Si vous souhaitez utiliser les storyboards, vous aurez besoin de la magie supplémentaire avec @IBInspectable.

La deuxième option est le sous-classement mais je préfère éviter cela.

0
Dzmitry Navak