web-dev-qa-db-fra.com

Bouton d'effacement UITextField personnalisé

Est-il possible de personnaliser l'image du bouton en clair dans une UITextField? J'ai un fond de texte sombre et le "x" n'est pas assez visible.

28
gemini

Vous pouvez définir votre propre bouton d'effacement personnalisé sur la propriété rightView du champ de texte. Assurez-vous de définir la propriété rightViewMode sur UITextFieldViewModeWhileEditing ou UITextFieldViewModeAlways, selon vos besoins.

Si la position du bouton ne convient pas à vos besoins, vous pouvez sous-classer UITextField et remplacer la méthode rightViewRectForBounds:.

La documentation indique que la valeur par défaut de la propriété clearButtonMode est UITextFieldViewModeNever, mais je suppose qu'Interface Builder peut la définir sur UITextFieldViewModeWhileEditing. Assurez-vous de la définir sur la valeur "never" afin qu'elle n'apparaisse pas.

Toutes ces propriétés sont documentées dans UITextField - Référence de classe

49
Danra

Vous pouvez accéder à cette propriété en utilisant KVO:

UIButton *clearButton = [myTextField valueForKey:@"_clearButton"];
[clearButton setImage:[UIImage new] forState:UIControlStateNormal];
33
Laszlo

Testé iOS7.0 - 8.4

Il est possible de mettre à jour la propriété backgroundImage de tous les boutons désactivés à l'aide de la méthode UIAppearance suivante. Malheureusement, vous ne pouvez pas mettre à jour l'image du bouton:

UIButton *defaultClearButton = [UIButton appearanceWhenContainedIn:[UITextField class], nil];
[defaultClearButton setBackgroundImage:[UIImage imageNamed:@"clearButtonBkg1.png"] forState:UIControlStateNormal];

L'utilisation des images suivantes donne le bouton d'effacement suivant:

Image de fond blanc @ 3x:

 White clear button background

 enter image description here

Note: Ceci mettra à jour l'image de fond de TOUS les boutons contenus dans les champs de texte

8
Brody Robertson

Swift 2.2+/iOS 9+ version de @Brody Robertson:

let defaultClearButton = UIButton.appearanceWhenContainedInInstancesOfClasses([UITextField.self])
defaultClearButton.setBackgroundImage(UIImage(named: "ClearIcon"), forState: UIControlState.Normal)
2
zgorawski

Swift 3

let customClearButton = UIButton.appearance(whenContainedInInstancesOf: [UITextField.self])
customClearButton.setBackgroundImage(UIImage(named: "custom_cb"), for: .normal)
1
Claus

dépend de /Tuss László's répondre

Swift 3.0

myTextField.clearButtonMode = .whileEditing
if let clearButton = myTextField.value(forKeyPath: "_clearButton") as? UIButton {
    clearButton.setImage(UIImage(named:"myImage"), for: .normal)
    clearButton.setImage(UIImage(named:"myImage"), for: .highlighted)
}

Mais utilisez-le vraiment avec précaution. Si Apple change d'implémentation dans les prochaines versions iOS, cela ne fonctionnerait pas

1
Pavel Volobuev

Une solution consiste à créer une variable UITextField personnalisée qui présente l'image souhaitée en tant que sous-vue et efface le champ de texte parent lorsque vous appuyez dessus. Vous désactivez le bouton par défaut et ajoutez votre comportement personnalisé dans ce champ de texte personnalisé.

Cela devrait vous aider à démarrer. S'il y a d'autres questions concrètes, n'hésitez pas à modifier votre question ou votre commentaire ici s'il s'agit d'un problème mineur.

0
Sebastian Wramba