J'utilise un UITextField
avec un UIPickerView
pour son inputView
, de sorte que lorsque l'utilisateur appuie sur le champ de texte, un sélecteur est appelé pour qu'il sélectionne une option.
Presque tout fonctionne, mais j'ai un problème: le curseur clignote toujours dans le champ de texte lorsqu'il est actif, ce qui est moche et inapproprié, car l'utilisateur n'est pas censé taper dans le champ et ne se voit pas présenter de clavier. Je sais que je pourrais hackily résoudre ce en mettant editing
à NO
sur le champ de texte et le suivi des touches sur, ou en le remplaçant par un bouton de style personnalisé, et convoquant le sélecteur via le code. Cependant, je souhaite utiliser les UITextFieldDelegate
méthodes pour toute la gestion des événements sur le champ de texte et des hacks tels que le remplacement du champ de texte par un bouton ne permettent pas cette approche.
Comment puis-je simplement masquer le curseur sur le UITextField
?
la source
À partir d'iOS 7, vous pouvez maintenant simplement définir le
tintColor = [UIColor clearColor]
sur le champ textField et le curseur disparaîtra.la source
caretRectForPosition:
solution de remplacement.Vous pouvez simplement effacer la teinte du champ de texte
Swift 3.0
la source
Vous pouvez également vouloir empêcher l'utilisateur de sélectionner, copier ou coller du texte afin que la seule entrée de texte provienne de la vue du sélecteur.
http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/
la source
Vérifiez la propriété
selectedTextRange
du protocoleUITextInput
auquel la classe seUITextField
conforme. Peu! C'est là une leçon de programmation orientée objet.Masquer le curseur
Pour masquer le signe d'insertion, supprimez la plage de texte sélectionnée dans le champ de texte.
Afficher le curseur
Voici deux façons d'afficher le curseur.
Définissez la plage de texte sélectionnée dans le champ de texte à la fin du document.
Pour garder le curseur au même endroit, commencez par stocker la plage de texte sélectionnée dans le champ de texte dans une variable d'instance.
Ensuite, lorsque vous souhaitez afficher le curseur, redéfinissez simplement la plage de texte sélectionnée dans le champ de texte sur ce qu'elle était à l'origine:
la source
caretRectForPosition
. C'est plus explicite ce qu'il fait, et les documents que vous avez cités n'indiquent pas clairement quel devrait être le comportement du curseur quand il n'y a pas de sélection actuelle. Si l'affirmation de @ ArtGeigel selon laquelle cela ne fonctionne pas était correcte (ce qui n'est pas le cas, du moins pour autant que je sache), il ne serait pas clair qu'il s'agissait d'un bogue.Réponse fournie par le PO, copiée à partir du corps des questions pour aider à nettoyer la queue toujours croissante de questions sans réponse.
J'ai trouvé une autre solution: sous
UIButton
-classer et remplacer ces méthodesMaintenant, le bouton, en tant que
UIResponder
, a un comportement similaire à celuiUITextField
et une implémentation assez simple.la source
UITextFieldDelegate
avec ceci pour gérer les événements d'édition de début et de fin. Au lieu de cela - à moins qu'il n'y ait un moyen de gérer ces événements que je ne connais pas - vous devrez remplacerbecomeFirstResponder
etresignFirstResponder
dans la sous-classe de bouton, et éventuellement créer votre propre protocole de délégué, ajouter unedelegate
propriété et appeler le délégué de ce qui précède méthodes. C'est beaucoup plus de travail que de simplement remplacercaretRectForPosition
dans uneUITextField
sous - classe.UIResponder
référence de la classe auparavant, et je n'avais aucune idée qu'une telle astuce était possible.UITextField
et de cacher le curseur, ce qui est fondamentalement un hack puisque nous utilisons alors le champ de texte comme étiquette pendant n'utilisant aucune des fonctionnalités duUITextField
.Version Swift 5 du post de Net
la source
définir la teinteCouleur sur Clear Color
et vous pouvez également définir à partir du générateur d'interface
la source
Si vous souhaitez masquer le curseur, vous pouvez facilement l'utiliser! Cela a fonctionné pour moi.
la source
Réponse fournie par le PO, copiée à partir du corps des questions pour aider à nettoyer la queue toujours croissante de questions sans réponse.
Je pense que j'ai la bonne solution mais si elle peut être améliorée sera la bienvenue :) Eh bien, j'ai créé une sous-classe de UITextField et remplacé la méthode qui renvoie le CGRect pour les limites
Le problème? Le texte ne s'affiche pas car le rect est zéro. Mais j'ai ajouté un UILabel en tant que sous-vue du contrôle et remplacé la méthode setText donc, lorsque nous entrons un texte comme d'habitude, le texte du champ de texte est nul et est le libellé qui montre le texte
Avec cela, la chose fonctionne comme prévu. Connaissez-vous un moyen de l'améliorer?
la source
Pour désactiver le curseur et le menu, j'utilise la sous-classe avec ces 2 méthodes:
la source
Je sous
UITextField
- classe simplement et remplacelayoutSubviews
comme suit:C'est un sale hack, et peut échouer à l'avenir (à quel point le curseur sera à nouveau visible - votre application ne plantera pas), mais cela fonctionne.
la source
Vous pouvez ajouter une
BOOL cursorless
propriétéUITextField
dans une catégorie via les objets associés.Ensuite, utilisez la méthode swizzling pour alterner
caretRectForPosition:
avec une méthode qui bascule entreCGRectZero
et sa valeur par défaut à l'aide decursorless
.Cela conduit à une interface simple via une catégorie drop-in. Ceci est démontré dans les fichiers suivants.
Déposez-les simplement et profitez de cette interface simple
UITextField
catégorie: https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.h https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless .mSwizzling de méthode: https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject% 2BRXRuntimeAdditions.m
la source