Mon application utilise un UITextView
. Maintenant, je veux UITextView
avoir un espace réservé similaire à celui que vous pouvez définir pour un UITextField
.
Comment faire ça?
Mon application utilise un UITextView
. Maintenant, je veux UITextView
avoir un espace réservé similaire à celui que vous pouvez définir pour un UITextField
.
Comment faire ça?
UITextView
la solution devient tout à fait différente. Voici quelques solutions.Réponses:
J'ai apporté quelques modifications mineures à la solution de bcd pour permettre l'initialisation à partir d'un
Xib
fichier, l'habillage du texte et conserver la couleur d'arrière-plan. Espérons que cela sauvera les autres.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
la source
Un moyen simple, il suffit de créer du texte d'espace réservé en
UITextView
utilisant lesUITextViewDelegate
méthodes suivantes :n'oubliez pas de définir
myUITextView
avec le texte exact sur la création par exempleet rendre la classe parente a
UITextViewDelegate
avant d'inclure ces méthodes, par exempleCode pour Swift 3.1
n'oubliez pas de définir
myUITextView
avec le texte exact sur la création par exempleet rendre la classe parente a
UITextViewDelegate
avant d'inclure ces méthodes, par exemplela source
text
attribut de la vue de texte qui est plutôt sympa ... alors que cette méthode le modifieJe n'étais pas trop satisfait de l'une des solutions publiées car elles étaient un peu lourdes. Ajouter des vues à la vue n'est pas vraiment idéal (surtout dans
drawRect:
). Ils ont tous deux eu des fuites, ce qui n'est pas acceptable non plus.Voici ma solution: SAMTextView
SAMTextView.h
SAMTextView.m
C'est beaucoup plus simple que les autres, car il n'utilise pas de sous-vues (ou n'a pas de fuites). Sentez-vous libre de l'utiliser.
Mise à jour 11/10/11: elle est désormais documentée et prend en charge l'utilisation dans Interface Builder.
Mise à jour 24/11/13: pointez sur le nouveau référentiel.
la source
setText
pour également mettre à jour l'espace réservé lors du changement de propriété de texte par programme: - (void) setText: (NSString *) string {[super setText: string]; [self _updateShouldDrawPlaceholder]; }notification
argument est mal orthographié dans la dernière méthode, cependant, et c'est un changement trop petit pour être soumis en tant que modification.Je me suis trouvé un moyen très simple d'imiter un espace réservé
Éditer:
Modification des instructions if pour comparer les balises plutôt que le texte. Si l'utilisateur supprimait son texte, il était également possible de supprimer accidentellement une partie de l'espace
@"Foobar placeholder"
réservé. Cela signifiait que si l'utilisateur saisissait à nouveau le texteVoir la méthode déléguée suivante-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
, cela ne fonctionnerait pas comme prévu. J'ai essayé de comparer par la couleur du texte dans l'instruction if, mais j'ai constaté que la couleur gris clair définie dans le générateur d'interface n'est pas la même que la couleur gris clair définie dans le code avec[UIColor lightGreyColor]
Il est également possible de réinitialiser le texte de l'espace réservé lorsque le clavier revient et que [textView length] == 0
ÉDITER:
Juste pour rendre la dernière partie plus claire - voici comment vous pouvez redéfinir le texte de l'espace réservé:
la source
Ce que vous pouvez faire est de configurer la vue texte avec une valeur initiale dans la
text
propriété et de changer latextColor
en[UIColor grayColor]
ou quelque chose de similaire. Ensuite, chaque fois que la vue de texte devient modifiable, effacez le texte et présentez un curseur, et si le champ de texte est à nouveau vide, remettez votre texte d'espace réservé. Changez la couleur[UIColor blackColor]
comme approprié.Ce n'est pas exactement la même chose que la fonctionnalité d'espace réservé dans un UITextField, mais elle est proche.
la source
Vous pouvez définir l'étiquette sur le
UITextView
paret le cacher sur la
TextViewdidChange
méthode.C'est la manière simple et facile.
la source
Si quelqu'un a besoin d'une solution pour Swift:
Ajoutez UITextViewDelegate à votre classe
la source
Solution simple Swift 3
Ajoutez
UITextViewDelegate
à votre classeEnsemble
yourTextView.delegate = self
Créez
placeholderLabel
et positionnez-le à l'intérieuryourTextView
Maintenant animer tout
placeholderLabel.alpha
surtextViewDidChange
:vous devrez peut-être jouer avec la
placeholderLabel
position pour bien la régler, mais cela ne devrait pas être trop difficilela source
let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
J'ai étendu la réponse de KmKndy, de sorte que l'espace réservé reste visible jusqu'à ce que l'utilisateur commence à modifier le
UITextView
plutôt que de simplement appuyer dessus. Cela reflète la fonctionnalité des applications Twitter et Facebook. Ma solution ne vous oblige pas à sous-classer et fonctionne si l'utilisateur tape directement ou colle du texte!n'oubliez pas de définir myUITextView avec le texte exact lors de la création, par exemple
et faire de la classe parent un délégué UITextView avant d'inclure ces méthodes, par exemple
la source
Je recommande d'utiliser
SZTextView
.https://github.com/glaszig/SZTextView
Ajoutez votre valeur
UITextView
par défaut à partir destoryboard
, puis modifiez sa classe personnaliséeSZTextView
comme ci-dessous 👇👇👇👇Ensuite, vous verrez deux nouvelles options dans le
Attribute Inspector
👇👇👇👇la source
Ci-dessous se trouve un port Swift du code ObjC "SAMTextView" publié comme l'une des premières réponses à la question. Je l'ai testé sur iOS 8. J'ai modifié quelques éléments, y compris le décalage des limites pour le placement du texte de l'espace réservé, car l'original était trop haut et trop à droite (suggestion utilisée dans l'un des commentaires de ce post).
Je sais qu'il existe de nombreuses solutions simples, mais j'aime l'approche du sous-classement UITextView car elle est réutilisable et je n'ai pas à encombrer les classes en l'utilisant avec les mécanismes.
Swift 2.2:
Swift 4.2:
la source
voici comment je l'ai fait:
UITextView2.h
UITextView2.m
la source
Voici une solution beaucoup plus simple qui se comporte exactement comme l'espace réservé d'UITextField mais qui ne nécessite pas de dessiner des vues personnalisées ou de démissionner du premier répondant.
(la deuxième vérification dans l'instruction else if concerne le cas où rien n'est entré et l'utilisateur appuie sur la touche de retour arrière)
Définissez simplement votre classe comme UITextViewDelegate. Dans viewDidLoad, vous devez initialiser comme
la source
Salut, vous pouvez utiliser IQTextView disponible dans IQKeyboard Manager, il est simple à utiliser et à intégrer, il suffit de définir la classe de votre textview à IQTextView et vous pouvez utiliser sa propriété pour définir l'étiquette d'espace réservé avec la couleur que vous voulez. Vous pouvez télécharger la bibliothèque depuis IQKeyboardManager
ou vous pouvez l'installer à partir de cocoapods.
la source
UITextViewDelegate
a très bien fonctionnéDésolé d'ajouter une autre réponse, mais je viens de retirer quelque chose comme ça et cela a créé le type d'espace réservé le plus proche de UITextField.
J'espère que cela aide quelqu'un.
la source
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
Sinon, le premier caractère entré dans la vue de texte a été placé à la fin du texteUn moyen simple d'utiliser cela dans une ligne de code:
Prenez une étiquette jusqu'à UITextView dans .nib en connectant cette étiquette à votre code, après.
la source
J'ai modifié l'implémentation de Sam Soffes pour fonctionner avec iOS7:
N'oubliez pas de définir des
_placeholderAttribues = nil
méthodes susceptibles de modifier la police et les autres signes susceptibles de les affecter. Vous pouvez également ignorer la création "paresseuse" du dictionnaire d'attributs si cela ne vous dérange pas.ÉDITER:
N'oubliez pas d'appeler setNeedsDisplay dans une version redéfinie de setBounds si vous souhaitez que l'espace réservé apparaisse bien après les animations de mise en page automatique et autres.
la source
Vous pouvez également créer une nouvelle classe TextViewWithPlaceholder en tant que sous-classe de UITextView.
(Ce code est un peu grossier - mais je pense qu'il est sur la bonne voie.)
Dans votre délégué, ajoutez ceci:
la source
J'ai créé ma propre version de la sous-classe de 'UITextView'. J'ai aimé l' idée de Sam Soffes d'utiliser les notifications, mais je n'ai pas aimé le drawRect: écraser. Semble exagéré pour moi. Je pense que j'ai fait une mise en œuvre très propre.
Vous pouvez consulter ma sous-classe ici . Un projet de démonstration est également inclus.
la source
Ce fil a eu beaucoup de réponses, mais voici la version que je préfère.
Il étend la
UITextView
classe existante et est donc facilement réutilisable, et il n'intercepte pas les événements commetextViewDidChange
(ce qui pourrait casser le code de l'utilisateur, s'ils interceptaient déjà ces événements ailleurs).En utilisant mon code (illustré ci-dessous), vous pouvez facilement ajouter un espace réservé à l'un de vos
UITextViews
semblables:Lorsque vous définissez cette nouvelle valeur d'espace réservé, elle ajoute discrètement un
UILabel
au-dessus de votreUITextView
, puis la masque / affiche si nécessaire:D'accord, pour apporter ces modifications, ajoutez un fichier "UITextViewHelper.h" contenant ce code:
... et un fichier UITextViewHelper.m contenant ceci:
Oui, c'est beaucoup de code, mais une fois que vous l'avez ajouté à votre projet et inclus le fichier .h ...
... vous pouvez facilement utiliser des espaces réservés dans
UITextViews
.Il y a un problème cependant.
Si tu fais ça:
... l'espace réservé apparaîtra en haut du texte. Lorsque vous définissez la
text
valeur, aucune des notifications régulières n'est appelée, donc je n'ai pas pu trouver comment appeler ma fonction pour décider d'afficher / masquer l'espace réservé.La solution consiste à définir
textValue
plutôt quetext
:Vous pouvez également définir la
text
valeur, puis appelercheckIfNeedToDisplayPlaceholder
.J'aime les solutions comme celle-ci, car elles «comblent l'écart» entre ce que Apple nous fournit et ce dont nous (en tant que développeurs) avons réellement besoin dans nos applications. Vous écrivez ce code une fois, l'ajoutez à votre bibliothèque de fichiers "helper" .m / .h et, avec le temps, le SDK commence à devenir moins frustrant.
(J'ai écrit une aide similaire pour ajouter un bouton "effacer" à mes UITextViews, une autre chose qui existe énormément dans
UITextField
mais pas dansUITextView
...)la source
Prenez d'abord une étiquette dans le fichier .h.
Ici je prends
Puis dans .m sous viewDidLoad, déclarez-le
textview est mon TextView.
Déclarez maintenant
Et votre espace réservé Textview est prêt!
la source
Je recommande d'utiliser le pod 'UITextView + Placeholder'
sur votre code
la source
mettre une étiquette sur la vue de texte.
la source
Il n'est pas possible de créer un espace réservé dans UITextView mais vous pouvez générer un effet comme espace réservé par cela.
OU vous pouvez ajouter une étiquette dans l'affichage de texte comme
Et mettre
la source
Cela imite parfaitement l'espace réservé d'UITextField, où le texte de l'espace réservé reste jusqu'à ce que vous tapiez réellement quelque chose.
la source
Voici encore une autre façon de le faire, qui reproduit la légère indentation de
UITextField
l'espace réservé de:Faites glisser un
UITextField
droit sous leUITextView
afin que leurs coins supérieurs gauche soient alignés. Ajoutez votre texte d'espace réservé au champ de texte.Dans viewDidLoad, ajoutez:
Puis ajouter:
la source
Permet de le rendre facile
Créez un UILabel et placez-le sur votre vue de texte (Donnez le texte en tant que couleur définie par l'espace réservé-vous pouvez faire tout cela dans votre xib) lorsque vous cliquez sur la vue texte
code complet ci-dessous
entête
la mise en oeuvre
@fin
N'oubliez pas de connecter textView et UILabel au propriétaire de fichiers de xib
la source
Jetez un œil à UTPlaceholderTextView .
Il s'agit d'une sous-classe pratique de UITextView qui prend en charge un espace réservé similaire à celui de UITextField. Particularités principales:
la source
J'ai lu tout cela, mais j'ai trouvé une solution très courte, Swift 3, qui a fonctionné dans tous mes tests. Cela pourrait être un peu plus général, mais le processus est simple. Voici tout ce que j'appelle "TextViewWithPlaceholder".
la source
layoutSubviews()
directement. Et vous n'avez pas supprimé l'observateur NotificationCenter.J'ai écrit un cours en swift. Vous pouvez importer cette classe à tout moment.
classe public CustomTextView: UITextView {
}
la source