Modifier la couleur du curseur / curseur UITextField et UITextView

222

Je me demande de changer la couleur du curseur / curseur dans un UITextField(Et UITextViewsi c'est la même réponse) dans iOS. J'ai vu des réponses pour le développement OSX, mais rien pour iOS.

Est-ce seulement possible?

RileyE
la source
1
Réponse détaillée pour UITextField, y compris comment procéder dans Interface Builder, à stackoverflow.com/a/18759577/1709587
Mark Amery
1
Réponse simple et complète sur stackoverflow.com/a/18945907/1292230 ;)
RileyE

Réponses:

513

Si vous ciblez iOS 7+, cela a été rendu beaucoup plus facile. Changez simplement letintColor le champ avec un curseur à l'aide du proxy d'apparence et cela s'appliquera dans toute l'application:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Objectif c:

[[UITextField appearance] setTintColor:[UIColor blackColor]];

La même réponse s'applique pour un individu UITextField :

Swift 3.0:

myTextField.tintColor = .black 

Objectif c

[myTextField setTintColor:[UIColor blackColor]];
DiscDev
la source
13
J'ai constaté que les couleurs de teinte de mon élément UIBarButton étaient fixées à leurs valeurs par défaut même si je définissais la couleur de teinte sur quelque chose de complètement différent. J'ai résolu le problème en définissant la couleur de teinte des UITextFields individuellement lors de leur création.
willtalmadge
Cela fonctionne, mais seulement si vous le faites dans didFinishLaunching? Ou pouvez-vous le faire en fonction de l'interaction de l'utilisateur, par exemple en appuyant sur un bouton?
Steffen Andersen
@SteffenAndersen, il doit se comporter conformément à la documentation de l'API proxy UIAppearance.
DiscDev
[[Apparence UITextView] setTintColor: turquoise]; pour une raison quelconque, cela change la couleur de mes boutons de navigation, comment avez-vous réglé individuellement?
John
3
Sur Swift 3.0, utilisez ceci: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
44

Avec iOS7, vous pouvez simplement changer la teinte de la textField

Casquette
la source
20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
Peter Kreinz
la source
1
Sur Swift 3.0, utilisez ceci: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato
13

Remarque: Cette réponse est obsolète et doit être utilisée uniquement pour le développement pré-iOS 7. Voir les autres réponses pour une solution 1 ligne utilisant le proxy d'apparence dans iOS 7.

Je suis arrivé à cette question après avoir rencontré le même problème dans un projet sur lequel je travaillais.

J'ai réussi à créer une solution qui sera acceptée par l'équipe de révision de l'AppStore car elle n'utilise aucune API privée existante.

J'ai créé un contrôle appelé DGTextField qui étend UITextField.

Dov
la source
C'est bien. Honnêtement, à cause de cela, je vais certainement surveiller de plus près "Conforme à" dans les documents. Cependant, je suis content qu'une seule personne ait passé du temps à lire et à bricoler à ce sujet. J'espère que d'autres personnes pourront voir et utiliser cela!
RileyE
Cependant, je pourrais recommander des options d'animation, en supprimant @propery et en créant simplement des setters et des getters ainsi qu'un setter et un getter pour la largeur du curseur personnalisé. Vous n'êtes peut-être pas intéressé, mais j'aime toujours les petits ajustements!
RileyE
@RileyE Je suis heureux que vous ayez pu bénéficier de ma solution. N'hésitez pas à bifurquer le dépôt et à ajouter les modifications que vous souhaitez partager.
Dov
3
C'est beaucoup plus facile dans iOS 7 - voir ma réponse ci-dessous: stackoverflow.com/a/18945907/1103584
DiscDev
12
yourTextField.tintColor = [UIColor whiteColor];

Cela fonctionne si vous le définissez dans le code, car le déclencheur de couleur ne le fait pas dans l'Interface Builder (Xcode 6.1.1). Il convenait bien sans avoir besoin de changer de proxy d'apparence.

David
la source
2
Pour une raison inconnue, cela ne fonctionne pas pour moi avec whiteColor mais fonctionne avec toutes les autres couleurs (test sur iOS 8). J'ai dû définir une couleur qui est presque blanche mais pas blanche pour que cela fonctionne.
Leszek Szary
@LeszekSzary Hey! Tu m'as sauvé la journée! J'essayais depuis près de 4 heures et tes mots étaient l'indice! Apple devrait corriger ce bug fou qui rend le développeur fou.
Karthick Ramesh
10

Réglage tintColorpour UITextFieldet UITextViewfonctionne différemment. Alors que pour UITextFieldvous, vous n'avez pas besoin d'appeler un code supplémentaire après la mise tintColorà jour pour changer la couleur du curseur, mais pour UITextViewvous, vous en avez besoin.

Donc, après avoir défini tintColorpour UITextView(cela n'a pas d'importance dans IB ou dans le code), vous devez appeler textView.tintColorDidChange()pour l'appliquer (en fait, il transmettra la configuration de la vue texte à sa hiérarchie de sous-vues).

il y a
la source
5

Cela a fonctionné pour moi rapidement:

UITextField.tintColor = UIColor.blackColor()

Vous pouvez également définir cela dans le storyboard: https://stackoverflow.com/a/18759577/3075340

Micro
la source
Ça ne marche pas. J'ai eu l'erreur:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros
@pableiros Ce qui précède était avec Swift 2. Peut-être que vous utilisez Swift 3 maintenant?
Micro
J'ai essayé sur Swift 3 et Swift 2.3, je ne sais pas si sur Swift 2.2 et inférieur cela fonctionne
pableiros
3

Une approche plus générale serait de définir la teinte de l'apparence de l'UIView.

UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];

Est logique si vous utilisez de nombreux éléments d'interface utilisateur par défaut.

arnekolja
la source
2
Hmmm ... cela a de nombreux autres effets secondaires ... la question ne porte que sur la modification de la couleur du curseur, et votre réponse va teinter chaque UIView de l'application ... ce n'est probablement pas l'approche que la plupart des gens veulent prendre.
DiscDev
+1 sur cela, trop d'effets secondaires, si le but est juste de changer la couleur du curseur. La définition de UIView tintColor EST utile lorsque vous stylisez un conteneur (mais je n'utiliserais pas[UIView appearance]
colinta
2

Essayez, ça marche pour moi.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];
Durgesh
la source
6
Cela utilise une méthode privée, mais merci pour la suggestion. Cela peut facilement faire rejeter une demande.
RileyE
0

L'approche de Durgesh fonctionne.

J'ai également utilisé de telles solutions KVC à plusieurs reprises. Malgré qu'il semble être sans papiers, mais cela fonctionne. Franchement, vous n'utilisez aucune méthode privée ici - uniquement le codage valeur-clé qui est légal.

PS Hier, ma nouvelle application est apparue sur l'AppStore sans aucun problème avec cette approche. Et ce n'est pas le premier cas lorsque j'utilise KVC pour modifier certaines propriétés en lecture seule (comme navigatonBar) ou ivars privés.

malex
la source
1
Il n'utilise pas une méthode privée, mais plutôt que les clés ne sont pas documentées, ce qui signifie qu'elles ne doivent pas être utilisées pour des applications sur l'App Store. Votre demande peut être rejetée subjectivement. Vous devez avoir eu un bon évaluateur, car beaucoup ont été rejetés pour avoir utilisé cette méthode.
RileyE
Ensuite, j'ai environ 10 critiques aimables :) et mes nombreux collègues aussi.
malex
1
Juste pour clarifier, le "codage de valeur-clé" dans ce cas attribue une valeur à une propriété en utilisant la méthode de commodité. La raison pour laquelle nous utilisons cela, par rapport à un setter, est parce que la propriété est inaccessible / cachée / privée.
RileyE
1
Ici, je veux dire (peut-être que je ne sais pas quelque chose d'important) seulement que la documentation sur KVC n'implique aucune restriction littéralement. J'ai donc réussi à utiliser tout cela. Et si tout va bien d'autres.
malex
1
J'ai apprécié. Cependant, Apple, dans ses `` Conditions d'utilisation '', déclare que nous sommes autorisés à utiliser et à discuter ouvertement de tout ce qui est inclus dans leur documentation et interdit l'utilisation de méthodes non documentées (l'accès à la méthode de définition `` textInputTraits '' via KVC serait inclus, car le propriété non documentée). Essentiellement, si vous ne trouvez pas la méthode dans la documentation, elle est interdite. Interdit ne garantit cependant pas le rejet. Certaines applications ont été rejetées pour des raisons incluses dans certaines de mes applications qui parviennent au magasin. C'est aléatoire avec des méthodes non documentées.
RileyE
0

Pour la version d'Interface Builder avec Swift

@IBOutlet weak var tvValue: UITextView! {
        didSet {
            tvValue.tintColor = .black
        }
    }
Mike Glukhov
la source
0

Si le UITextFieldest de UISearchBarpuis obtenez d'abord la propriété textFieldfrom searchBarpuis appliquez tintColor:

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray

la source
0

Swift 4

Dans viewDidLoad (), appelez simplement le code ci-dessous:

EXEMPLE DE CODE

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()
Shamshad
la source
0

Je pense que si vous voulez des couleurs personnalisées, vous pouvez aller dans le Assets.xcassetsdossier, faites un clic droit et sélectionnezNew Color Set , une fois que vous avez créé la couleur que vous avez définie, donnez-lui un nom pour la réutiliser.

Et vous pouvez l'utiliser comme ceci:

import UIKit 

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME")  #here
    }
}

Testé sur macOS 10.15 / iOS 13 / Swift 5

rouille
la source
0

Pour les personnes qui cherchent l'équivalent en SwiftUI pour Textfieldcela est accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Beninho85
la source