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
Vous pouvez utiliser le code suivant:
sendButton.enabled = YES;
sendButton.alpha = 1.0;
or
sendButton.enabled = NO;
sendButton.alpha = 0.5;
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)
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.
Vous pouvez utiliser adjustsImageWhenDisabled
qui est la propriété de UIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)
Ex:
Button.adjustsImageWhenDisabled = false
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];
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
}
}
}
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
Dans Swift :
previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5
ou
nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
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!
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)
}
}
}
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
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
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 !!!
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.