Come creare un UITextfield multilinea?


259

Sto sviluppando un'applicazione in cui l'utente deve scrivere alcune informazioni. A questo scopo ho bisogno di una UITextFieldlinea multipla (in generale UITextFieldè una linea singola).

Mentre sto cercando su Google trovo una risposta usando UITextViewinvece che UITextfieldper questo scopo.


Ecco il piccolo controllo che ho scritto esattamente per quello scopo. ha il supporto multilinea e anche il pulsante Fine per chiudere la tastiera. sentiti libero di usarlo code.google.com/p/galtextfield
Gal Blank

2
usa queste classi di terze parti importa il tuo progetto xcode e
usalo

Risposte:


435

UITextField è specificamente una sola riga.

La tua ricerca su Google è corretta, devi usarla UITextViewanziché UITextFieldper visualizzare e modificare il testo su più righe.

In Interface Builder, aggiungi un UITextViewpunto desiderato e seleziona la casella "modificabile". Sarà multilinea per impostazione predefinita.


7
Quindi dimmi per favore in che modo l'app Calendario nativa rende Visualizza con segnaposto e parole a capo per le note durante l'aggiunta dello schermo?
Gennadiy Ryabkin,

3
come impostare segnaposto per UITextView?
Mani,

4
Non è possibile aggiungere segnaposto a TextView, ma è possibile aggiungere un'etichetta grigia su TextView e nasconderla se l'utente immette del testo.
Andrew Romanov,

Per favore qualcuno può aiutarmi con la seguente domanda? Se l'utente scrive testo puntato (più interruzioni di riga) in UITextView, come rilevare il numero totale di interruzioni di riga?
Markus,

@Markus dovresti aprire una nuova domanda per questo
Nathan F.

20

Puoi falsificare un UITextField usando UITextView. Il problema che avrai è che perdi la funzionalità di segnaposto.

Se scegli di utilizzare un UITextView e hai bisogno del segnaposto, procedi come segue:

A tuo avvisoDidLoad imposta il colore e il testo sui segnaposto:

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

Quindi fai scomparire il segnaposto quando UITextView è selezionato:

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

Quando l'utente termina la modifica, assicurarsi che ci sia un valore. In caso contrario, aggiungi di nuovo il segnaposto:

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

Altre funzionalità che potresti dover falsificare:

UITextField spesso capitalizza ogni lettera, puoi aggiungere quella funzione a UITableView:

myTxtView.autocapitalizationType = .words

Di solito gli UITextField non scorrono:

myTxtView.scrollEnabled = false

18

Ok l'ho fatto con qualche trucco;) Prima costruisci un UITextFielde aumentato è sizecosì:

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

Quindi crea un UITextViewesattamente nella stessa area che hai creato UITextFielde cancellato background color. Ora sembra che tu abbia più righe TextField!


2
Ho usato il layout automatico e ho bloccato tutti i lati di UITextField su UITextView. Davvero un bel trucco, grazie!
Phatmann,

per favore @phantmann, puoi mostrarci il tuo codice per il layout automatico?
Esteve

8
Questo crea un UITextView. Il punto di avere un UITextField è che si comporta diversamente da un UITextView.
Nate Symer,

2
Esistono molte differenze tra UITextViewe UITextfield: ereditano da UIScrollViewvs UIControl, non modificabili per impostazione predefinita rispetto a modificabili per impostazione predefinita, multilinea vs. riga singola, protocolli delegati diversi, nessun segnaposto vs. segnaposto.
Sam Ballantyne,

UITextViewè per paragrafi di testo. Usalo se hai bisogno di un paragrafo di testo, e non altrimenti.
Sam Ballantyne,

9

Oltre al comportamento a più righe, la differenza principale tra UITextView e UITextField è che UITextView non propone un segnaposto. Per aggirare questa limitazione, è possibile utilizzare un UITextView con un "segnaposto falso".

Vedi questa domanda SO per i dettagli: Segnaposto in UITextView .


2

Se è necessario disporre di un UITextField con 2 righe di testo, un'opzione è quella di aggiungere un UILabel come sottoview di UITextField per la seconda riga di testo. Ho un UITextField nella mia app che gli utenti spesso non capiscono che è modificabile toccando e volevo aggiungere un piccolo testo di sottotitoli che dice "Tap to Edit" su 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];

2

Sì, un UITextView è quello che stai cercando. Dovrai affrontare alcune cose in modo diverso (come il tasto invio) ma puoi aggiungere del testo e ti permetterà di scorrere su e giù se c'è troppo testo all'interno.

Questo link contiene informazioni su come creare una schermata per inserire i dati:

creare una schermata di inserimento dati



0

Un supplemento alla risposta di h4xxr di cui sopra, un modo più semplice per regolare l'altezza di UITextField è selezionare lo stile del bordo quadrato nelle finestre di ispezione degli attributi-> Campo di testo. (Per impostazione predefinita, lo stile del bordo di un UITextfield è un'ellisse.)

Riferimento: Brian ha risposto qui: Come impostare l'altezza UITextField?


-1

C'è un'altra opzione che ha funzionato per me:

Sottoclasse UITextField e sovrascrivi:

- (void)drawTextInRect:(CGRect)rect

In questo metodo puoi ad esempio:

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

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

Questo codice visualizzerà il testo usando tutte le righe necessarie se il rettangolo ha spazio sufficiente. È possibile specificare qualsiasi altro attributo in base alle proprie esigenze.

Non usare:

self.defaultTextAttributes

che forzerà il rendering del testo di una riga

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.