Espace réservé dans UITextView
Mon application utilise un UITextView
. Maintenant, je veux le UITextView
d'avoir un espace réservé semblable à celui que vous pouvez définir pour un UITextField
.
Comment faire?
- Three20 de TTTextEditor (lui-même à l'aide de UITextField) soutient le texte de l'espace réservé ainsi que la croissance en hauteur (il se transforme en un UITextView).
- Voici les petites et génial solution pour ceci
- Comment sur l'utilisation de UITextView+espace Réservé catégorie? github.com/devxoul/UITextView-Placeholder
- J'faveur @devxoul la solution de coz il utilise catégorie, pas de sous-classe. Et il crée également un domaine de "espace réservé" options (espace réservé de texte & couleur du texte) de l'IB de l'inspecteur. Il utilise des techniques de liaison. Quel grand code
- Si vous utilisez
UITextView
la solution devient très différente. Voici un couple de solutions. Flottant espace Réservé et Faux Natif des Espaces réservés - Essayez cette réponse 🙂 [_textView setTextColor:[UIColor lightGrayColor]];
- Ce qui est intéressant, c'est que le natif iOS application de Calendrier a plusieurs lignes de texte modifiable avec un espace réservé (ajout de Notes à un événement). Donc, il y a certaines preuves directes de l'Apple reconnaissent eux-mêmes de la nécessité de l'utiliser.
Vous devez vous connecter pour publier un commentaire.
J'ai fait quelques modifications mineures à la bcd solution pour permettre l'initialisation à partir d'un
Xib
fichier, l'habillage du texte, et pour maintenir la couleur d'arrière-plan. J'espère qu'il va sauver les autres de la difficulté.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
_updateShouldDrawPlaceholder
et l'utilisation desetNeedsDisplay
est plus approfondie.((UIPlaceHolderTextView *)MyTextView.placeholder).placeholder = @"blabla";
backgroundColor
propriété en quelque sorte. Je suppose que c'est parce que vous modifiez l'affichage de la hiérarchie dans drawRect.text
mais aussi des propriétés telles quefont
outextAlignment
, vous pouvez essayer cette catégorie: github.com/devxoul/UITextView-Placeholder- (void)setPlaceholder:(NSString *)placeholder { _placeholder = placeholder; [self setNeedsDisplay]; }
IBDesignable
à l' .h propriétés (juste avant la déclaration de type) pour être en mesure de mettre le texte et la couleur dans le Storyboard!Facile, il suffit juste de créer un espace réservé de texte dans
UITextView
à l'aide de laUITextViewDelegate
méthodes:juste n'oubliez pas de régler
myUITextView
avec le texte exact sur la création par exempleet de faire de la classe parent d'un
UITextViewDelegate
avant l'inclusion de ces méthodes par exempleCode Swift 3.1
juste n'oubliez pas de régler
myUITextView
avec le texte exact sur la création par exempleet de faire de la classe parent d'un
UITextViewDelegate
avant l'inclusion de ces méthodes par exempleenablesReturnKeyAutomatically
. 🙁text
attribut de la textview qui est plutôt sympa..alors que cette méthode modifieJe n'étais pas trop heureux avec les solutions affichées dès qu'elles étaient un peu lourdes. L'ajout de points de vue au point de vue n'est pas vraiment l'idéal (surtout dans
drawRect:
). Ils avaient tous les deux 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, comme il n'utilise pas de sous-vues (ou avez des fuites). N'hésitez pas à utiliser.
Mise à jour 11/10/11: Il est maintenant documenté et prend en charge l'utilisation dans Interface Builder.
Mise à jour 11/24/13: Pointez sur nouveau repo.
setText
également de mettre à jour l'espace réservé lors de la modification des propriétés de texte par programmation: - (void)setText:(NSString *)chaîne de caractères { [super setText:string]; [self _updateShouldDrawPlaceholder]; }notification
argument est mal orthographié dans la dernière méthode, même si, et c'est trop petit un changement de présenter comme une modification.Ce que vous pouvez faire est de configurer l'affichage de texte avec une certaine valeur initiale dans la
text
de la propriété, et de changer letextColor
à[UIColor grayColor]
ou quelque chose de similaire. Ensuite, chaque fois que l'affichage de texte devient modifiable, effacer le texte et de présenter un curseur, et si le champ de texte est jamais vide de nouveau, mettez votre texte d'espace réservé de retour. Changer la couleur de[UIColor blackColor]
appropriées.Ce n'est pas exactement la même que la fonctionnalité d'espace réservé dans un UITextField, mais il est proche.
Je me suis trouvé un moyen très facile d'imiter une place de titulaire
Edit:
Changé si les déclarations de comparer les balises plutôt que du texte. Si l'utilisateur a supprimé leur texte, il est également possible de supprimer accidentellement une partie de la place de titulaire
@"Foobar placeholder"
.Cela signifie que si l'utilisateur rentre dans le textView le délégué suivant la méthode,-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
, il ne serait pas fonctionner comme prévu. J'ai essayé de comparer par la couleur du texte dans l'instruction if, mais constaté que la lumière gris couleur définie dans interface builder n'est pas la même que la lumière grise de couleur sont définis dans le code avec[UIColor lightGreyColor]
Il est également possible de réinitialiser le texte de l'espace réservé lorsque le clavier retourne et la [textView longueur] == 0
EDIT:
Juste pour faire la dernière partie plus claire - ici, c'est comment vous pouvez définir le texte de l'espace réservé dos:
Vous pouvez placer l'étiquette sur le
UITextView
paret de le cacher sur
TextViewdidChange
méthode.C'est le simple & facile.
Si quelqu'un a besoin d'une Solution pour Swift:
Ajouter UITextViewDelegate à votre classe
Simple Swift 3 solution
Ajouter
UITextViewDelegate
à votre classeEnsemble
yourTextView.delegate = self
Créer
placeholderLabel
et placez à l'intérieur deyourTextView
Maintenant juste animer
placeholderLabel.alpha
surtextViewDidChange
:vous pourriez avoir à jouer avec
placeholderLabel
position de le configurer en droit, mais qui ne devrait pas être trop durlet 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 KmKndy de répondre, de sorte que l'espace réservé reste visible jusqu'à ce que l'utilisateur commence à modifier la
UITextView
plutôt que de simplement robinets sur elle. Cela reflète la fonctionnalité de Twitter et de Facebook apps. Ma solution ne nécessite pas de sous-classe et de travaux si l'utilisateur tape directement ou colle le texte!juste n'oubliez pas de régler myUITextView avec le texte exact sur la création par exemple
et de faire de la classe parent d'un UITextView délégué avant l'inclusion de ces méthodes par exemple
Je recommande d'utiliser
SZTextView
.https://github.com/glaszig/SZTextView
Ajouter par défaut de votre
UITextView
destoryboard
et puis changer sa classe personnalisée pourSZTextView
comme ci-dessousVous verrez alors deux nouvelle option dans le
Attribute Inspector
Ci-dessous est une Swift port de "SAMTextView" ObjC code affiché comme l'un de la première poignée de réponses à la question. Je l'ai testé sur iOS 8. J'ai modifié quelques petites choses, y compris les limites de décalage pour le placement du texte de l'espace réservé, que l'original était trop haut et trop loin à droite (utilisé suggestion dans l'un des commentaires de ce post).
Je sais qu'il y a beaucoup de solutions simples, mais j'aime l'approche de sous-classement UITextView parce que c'est réutilisable et je n'ai pas encombrer les classes utilisant les mécanismes.
Swift 2.2:
Swift 4.2:
c'est la façon dont je l'ai fait:
UITextView2.h
UITextView2.m
Ici un moyen plus facile solution qui se comporte exactement comme UITextField est réservé, mais n'a pas besoin de dessin vues personnalisées, ou de la démission du premier intervenant.
(la deuxième case dans le else si la déclaration est pour le cas où rien n'est saisi et que l'utilisateur appuie sur la touche retour arrière)
Il suffit de régler votre classe comme un UITextViewDelegate. Dans le viewDidLoad vous devez les initialiser comme
Désolé pour ajouter une autre réponse, Mais je viens de tirer quelque chose comme cela et cela a créé le plus proche-à-UITextField type d'espace réservé.
Espère que cela aide quelqu'un.
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
Sinon, le premier caractère étant entré dans le textview a été placé à la fin du texteSalut vous pouvez utiliser IQTextView disponible dans IQKeyboard Gestionnaire, il est simple à utiliser et à intégrer venez de définir la classe de votre textview pour IQTextView et vous pouvez utiliser ses biens pour le réglage de l'espace réservé de l'étiquette avec la couleur que vous voulez.
Vous pouvez télécharger la bibliothèque de IQKeyboardManager
ou vous pouvez l'installer à partir cocoapods.
UITextViewDelegate
a très bien fonctionnéFaçon Simple d'utiliser cette mesure dans les quelques lignes de code:
Prendre une étiquette jusqu'à UITextView dans .plume
la connexion de ce label à votre code
D'après elle.
J'ai modifié Sam Soffes de mise en œuvre pour travailler avec iOS7:
N'oubliez pas de régler
_placeholderAttribues = nil
dans les méthodes qui pourraient modifier la police et d'autres thigns qui pourrait les affecter. Vous pouvez également passer "paresseux" faire les attributs dictionnaire si ce n'est pas un bug vous.EDIT:
N'oubliez pas d'appeler setNeedsDisplay dans une version de remplacement de setBounds si vous aimez l'espace réservé à bien après mise en forme automatique des animations et la comme.
Vous pouvez également créer une nouvelle classe TextViewWithPlaceholder comme une sous-classe de UITextView.
(Ce code est une sorte de rude, mais je pense que c'est sur la bonne voie.)
Dans votre délégué, ajouter ceci:
J'ai fait ma propre version de la sous-classe de "UITextView'. J'ai aimé Sam Soffesl'idée d'utiliser les notifications, mais je n'ai pas aimé le drawRect: écraser. Semble exagéré pour moi. Je pense que j'ai fait un très propre mise en œuvre.
Vous pouvez regarder mon sous-classe ici. Un projet de démonstration est également inclus.
Ce thread a eu beaucoup de réponses, mais voici la version que je préfère.
Il s'étend l'existant
UITextView
de la classe est facilement réutilisables, et il n'est pas intercepter les événements commetextViewDidChange
(qui pourrait casser l'utilisateur du code, si elles étaient déjà à l'interception de ces événements, d'ailleurs).À l'aide de mon code (ci-dessous), vous pouvez facilement ajouter un espace réservé à l'un de vos
UITextViews
comme ceci:Lorsque vous définissez cette nouvelle valeur de l'espace réservé, tranquillement il ajoute une
UILabel
sur le dessus de votreUITextView
, puis se cacher/indique qu'il est nécessaire de:D'accord, de procéder à ces modifications, ajouter un "UITextViewHelper.h" fichier contenant ce code:
...et un UITextViewHelper.m fichier contenant ceci:
Yup, c'est beaucoup de code, mais une fois que vous l'avez ajouté à votre projet et inclus la .h fichier...
...vous pouvez facilement utiliser des espaces réservés dans
UITextViews
.Il y a une chasse aux sorcières si.
Si vous faites cela:
...l'espace réservé apparaît sur le dessus de le texte. Lorsque vous définissez la
text
valeur, aucun des notifications régulières est appelée, donc je ne pouvais pas travailler sur la façon d'appeler ma fonction pour décider d'afficher/masquer l'espace réservé.La solution est de définir la
textValue
plutôt quetext
:Alternativement, vous pouvez définir la
text
valeur, puis d'appelercheckIfNeedToDisplayPlaceholder
.J'aime solutions de ce type, car ils "combler l'écart" entre ce qu'Apple nous offre, et de ce que nous (les développeurs) réellement besoin dans nos applications. Vous écrivez ce code une fois, l'ajouter à votre bibliothèque de "l'aide" .m/.h les fichiers, et, au fil du temps, le SDK en fait commence à devenir moins frustrant.
(J'ai écrit un semblable aide pour l'ajout d'un bouton "effacer" pour mon UITextViews, une autre chose qui fâcheusement existe dans
UITextField
mais pas dansUITextView
...)D'abord prendre une étiquette .h fichier.
Ici, je prends
Puis dans .m sous viewDidLoad déclarer
textview est mon TextView.
Maintenant déclarer
Et votre Textview espace réservé est prêt !
Je recommande d'utiliser pod 'UITextView+espace Réservé'
sur votre code
mettre une étiquette sur le textview.
Il n'est pas possible de créer un espace réservé dans UITextView mais vous pouvez générer effet comme le titulaire de place par ce.
OU vous pouvez ajouter une étiquette dans le textview comme
et définir
Cette imite UITextField de l'espace réservé à la perfection, où la place de titulaire texte reste jusqu'à ce que vous tapez quelque chose.
Voici encore une autre façon de faire, celle qui reproduit la légère indentation de
UITextField
's espace réservé:Faites glisser un
UITextField
droit en vertu de laUITextView
de sorte que leur haut à gauche coins sont alignés. Ajoutez votre texte d'espace réservé pour le champ de texte.Dans le viewDidLoad, ajouter:
Puis ajouter:
Permet de le rendre facile
Créer un UILabel et de les placer sur votre texte(vue de Donner le texte de l'espace Réservé-mis en couleur gris vous pouvez faire tout cela dans votre xib)
Maintenant, à vous d'en-tête de fichier de déclarer la UILabel et aussi le textviewDelegate
Maintenant, vous pouvez simplement masquer l'étiquette lorsque vous cliquez sur le textview
code complet ci-dessous
en-tête
mise en œuvre
@fin
N'oubliez pas de connecter le textView et UILabel à filesowner de xib
Prendre un coup d'oeil à UTPlaceholderTextView.
C'est une pratique sous-classe de UITextView qui prend en charge l'espace réservé similaire à celle de l'objet UITextField. Caractéristiques principales:
J'ai lu tous ces domaines, mais est venu avec une très courte Swift 3, solution qui a fonctionné dans tous mes tests. Il peut supporter un peu plus de généralité, mais le processus est simple. Voici l'intégralité de la chose que j'appelle "TextViewWithPlaceholder".
layoutSubviews()
directement. Et vous n'avez pas à supprimer le NotificationCenter observateur.J'ai écrit une classe en swift. Vous pouvez importer cette classe chaque fois que nécessaire.
public class CustomTextView: UITextView {
}
Comment faire pour insérer un espace réservé dans UITextView?
La réponse de PJR fonctionne comme un charme. Ceux-ci ne fonctionne pas pour moi. Peut-être un iOS5 chose.
OK mon ansewer est un peu différent
J'ai créer une petite classe pour le faire pour vous.
TextViewShader.m fichier
TextViewShader.h fichier
c'est la simple ligne de code d'utilisation (ne pas oublier d'ajouter #import "TextViewShader.h")
amusez-vous 🙂
J'ai créé une variable d'instance pour vérifier si je vais vous montrer l'emplacement réservé ou pas:
Sur viewDidLoad j'ai mis:
Voici ce que ce n':
J'ai également créé un bouton de démissionner du clavier. Vous n'avez pas à le faire, mais le truc cool, c'est ici que l'espace réservé est montré à nouveau si de rien n'était entré
Je sais qu'il y a déjà beaucoup de réponses à cette question, mais je n'ai pas vraiment trouver de suffisamment (au moins dans Swift). J'ai besoin de la "placeholder" la fonctionnalité de la
UITextField
dans monUITextView
(je voulais le comportement exact, y compris le texte des attributs d'affichage, animations, etc, et ne veulent pas avoir à maintenir ce fil du temps). Je voulais aussi une solution qui offrait le même emplacement de la frontière comme unUITextField
(pas un pseudo qui ressemble un peu comme il ressemble pour l'instant, mais c'est exactement la même et sera toujours l'air exactement comme ça). Ainsi, alors que je n'était pas d'abord un fan de brouillage d'un contrôle supplémentaire dans le mélange, il semble que pour atteindre mes objectifs, j'ai dû utiliser une réelleUITextField
et de le laisser faire le travail.Cette solution gère le positionnement de l'espace réservé et de maintien de la police dans la synchronisation entre les deux contrôles de manière à ce que le texte de l'espace réservé est la police exacte et la position que le texte entré dans le champ (quelque chose que beaucoup d'autres solutions ne permettent pas d'adresse).
fatalError
J'ai créé un swift 3 version de le mieux classé de réponse
Vous avez juste besoin de faire sous-classement de UITextView.
TVComment est la propriété que détient le textView en question. Cela fera l'affaire.
J'ai écrit un nettoyeur de mise en œuvre après avoir essayé quelques-uns des approches et publié sur Github. Tirez sur les demandes et questions sont les bienvenus.
Certaines des principales améliorations par rapport à d'autres approches présentées ici:
drawRect:
. (Merci de ne pas le faire.)UITextField
).Voici une technique simple et astucieuse façon à obtenir le parfait de comportement.
Emprunter l'espace réservé de
UITextField
.Définir un champ de texte et de définir son texte transparent.
Ensemble textView du délégué et de synchroniser le champ de texte et de textView.
puis
Une approche plus simple est de créer un secondaire UITextView avec tous les mêmes attributs que le texte original de vue sauf pour une autre textColor, avec des contraintes pour assurer qu'ils restent alignés. Puis, quand tous les caractères sont entrés dans le texte principal de l'afficher, de masquer l'cloné affichage de texte, sinon de montrer la cloné affichage de texte avec le texte.
Ceci peut être réalisé de plusieurs façons, mais une relativement propre façon serait de la sous-classe UITextView et de garder toute cette logique dans la sous-classe.
Donc, la sous-classe UITextView et lui permettre de créer à la place du titulaire de vue paresseusement:
Fichier d'Interface:
Mise en œuvre de fichier:
À l'aide de la classe ci-dessus, si vous définissez une instance de FOOTextView du délégué à lui-même, tout va fonctionner hors de la boîte:
Si vous souhaitez un autre objet à prendre le relais en tant que délégué, alors vous avez juste besoin d'appeler le texte de la vue checkPlaceholder méthode dans le textViewDidChange: délégué de la méthode, par exemple;
Dans .la classe h
Dans .m classe