Comment créer un UITextfield multiligne?

259

Je développe une application où l'utilisateur doit écrire des informations. À cette fin, j'ai besoin d'un UITextFieldqui est multi-ligne (en général, UITextFieldc'est une seule ligne).

Comme je suis sur Google, je trouve une réponse à utiliser UITextViewau lieu de UITextfielddans ce but.

raaz
la source
Voici le petit contrôle que j'ai écrit exactement à cet effet. il a un support multiligne et également un bouton Terminé pour fermer le clavier. n'hésitez pas à l'utiliser code.google.com/p/galtextfield
Gal Blank
2
utilisez ces classes tierces importez votre projet xcode et utilisez-le, son lien fonctionne trop bien: github.com/adonoho/HPGrowingTextView
mahesh chowdary

Réponses:

435

UITextField est spécifiquement une seule ligne.

Votre recherche Google est correcte, vous devez utiliser UITextViewau lieu de UITextFieldpour afficher et modifier du texte multiligne.

Dans Interface Builder, ajoutez un UITextViewoù vous le souhaitez et cochez la case "modifiable". Il sera multiligne par défaut.

h4xxr
la source
7
Alors, dites-moi s'il vous plaît comment l'application de calendrier native rend la vue avec un espace réservé et un habillage de mots pour les notes à l'écran d'ajout d'événements?
Gennadiy Ryabkin
3
comment définir un espace réservé pour UITextView?
Mani
4
Vous ne pouvez pas ajouter d'espace réservé à TextView, mais vous pouvez ajouter une étiquette grise sur TextView et la masquer si l'utilisateur entre du texte.
Andrew Romanov
S'il vous plaît quelqu'un peut-il m'aider avec la question suivante? Si l'utilisateur écrit du texte à puces (plusieurs sauts de ligne) dans UITextView, comment détecter le nombre total de sauts de ligne?
Markus
@Markus, vous devriez ouvrir une nouvelle question pour cela
Nathan F.
20

Vous pouvez simuler un UITextField en utilisant UITextView. Le problème que vous aurez, c'est que vous perdez la fonctionnalité d'espace réservé.

Si vous choisissez d'utiliser un UITextView et avez besoin de l'espace réservé, procédez comme suit:

Dans votre viewDidLoad, définissez la couleur et le texte sur des espaces réservés:

myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."

Faites ensuite disparaître l'espace réservé lorsque votre UITextView est sélectionné:

func textViewDidBeginEditing (textView: UITextView) {
    if myTxtView.textColor.textColor == ph_TextColor && myTxtView.isFirstResponder() {
        myTxtView.text = nil
        myTxtView.textColor = .white
    }
}

Lorsque l'utilisateur a terminé la modification, assurez-vous qu'il existe une valeur. Si ce n'est pas le cas, ajoutez à nouveau l'espace réservé:

func textViewDidEndEditing (textView: UITextView) {
    if myTxtView.text.isEmpty || myTxtView.text == "" {
        myTxtView.textColor = .lightGray
        myTxtView.text = "Type your thoughts here..."
    }
}

Autres fonctionnalités que vous pourriez avoir besoin de simuler:

UITextField capitalise souvent chaque lettre, vous pouvez ajouter cette fonctionnalité à UITableView:

myTxtView.autocapitalizationType = .words

Les UITextField ne défilent généralement pas:

myTxtView.scrollEnabled = false
Dave G
la source
18

Ok je l'ai fait avec une astuce;) Commencez par construire un UITextFieldet augmenté c'est sizecomme ceci:

CGRect frameRect = textField.frame;
        frameRect.size.height = 53;
        textField.frame = frameRect;

Ensuite, créez un UITextViewexactement dans la même zone que celle que vous avez créée UITextField, et supprimez-la background color. Maintenant, il semble que vous ayez plusieurs lignes TextField!

Rudi
la source
2
J'ai utilisé la mise en page automatique et épinglé tous les côtés de l'UITextField à l'UITextView. Vraiment super truc, merci!
phatmann
veuillez @phantmann, pouvez-vous nous montrer votre code pour la mise en page automatique?
Esteve
8
Cela crée un UITextView. Le point d'avoir un UITextField est qu'il se comporte différemment d'un UITextView.
Nate Symer
2
Il y a un tas de différences entre UITextViewet UITextfield: ils héritent de UIScrollViewvs UIControl, non modifiables par défaut vs modifiables par défaut, multilignes vs unifilaires, différents protocoles de délégué, sans espace réservé vs espace réservé.
Sam Ballantyne
UITextViewest pour les paragraphes de texte. Utilisez-le si vous avez besoin d'un paragraphe de texte, et non autrement.
Sam Ballantyne
9

Outre le comportement sur plusieurs lignes, la principale différence entre UITextView et UITextField est que UITextView ne propose pas d'espace réservé. Pour contourner cette limitation, vous pouvez utiliser un UITextView avec un «faux espace réservé».

Voir cette question SO pour plus de détails: espace réservé dans UITextView .

MonsieurDart
la source
2

Si vous devez avoir un UITextField avec 2 lignes de texte, une option consiste à ajouter un UILabel en tant que sous-vue de l'UITextField pour la deuxième ligne de texte. J'ai un UITextField dans mon application que les utilisateurs ne réalisent souvent pas est modifiable en appuyant sur, et je voulais ajouter un petit texte de sous-titre qui dit "Appuyez pour modifier" à l'UITextField.

CGFloat tapLlblHeight = 10;
UILabel *tapEditLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, textField.frame.size.height - tapLlblHeight - 2, 70, tapLlblHeight)];
tapEditLbl.backgroundColor = [UIColor clearColor];
tapEditLbl.textColor = [UIColor whiteColor];
tapEditLbl.text = @"Tap to Edit";

[textField addSubview:tapEditLbl];
DiscDev
la source
2

Oui, une UITextView est ce que vous recherchez. Vous devrez gérer certaines choses différemment (comme la touche retour), mais vous pouvez y ajouter du texte et cela vous permettra de faire défiler vers le haut et vers le bas s'il y a trop de texte à l'intérieur.

Ce lien contient des informations sur la création d'un écran pour saisir des données:

créer un écran de saisie de données

nevan king
la source
1

utiliser UITextView au lieu de UITextField

Monir Khlaf
la source
0

Un complément à la réponse de h4xxr dans ce qui précède, un moyen plus facile d'ajuster la hauteur de l'UITextField est de sélectionner le style de bordure carrée dans les inspecteurs d'attributs-> Champ de texte. (Par défaut, le style de bordure d'un champ UITextfield est l'ellipse.)

Référence: Répondit Brian ici: Comment définir la hauteur UITextField?

Tony
la source
-1

Il y a une autre option qui a fonctionné pour moi:

Sous-classe UITextField et écraser:

- (void)drawTextInRect:(CGRect)rect

Dans cette méthode, vous pouvez par exemple:

    NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                  NSForegroundColorAttributeName : self.textColor };

    [self.text drawInRect:verticalAlignedRect withAttributes:attributes];

Ce code rendra le texte en utilisant autant de lignes que nécessaire si le rect a suffisamment d'espace. Vous pouvez spécifier tout autre attribut en fonction de vos besoins.

Ne pas utiliser:

self.defaultTextAttributes

ce qui forcera le rendu du texte sur une ligne

McFlys
la source