Bagaimana cara membuat UITextfield multiline?

259

Saya mengembangkan aplikasi di mana pengguna harus menulis beberapa informasi. Untuk keperluan ini saya memerlukan UITextFieldyang multi-line (secara umum UITextFieldadalah satu baris).

Karena saya Googling, saya menemukan jawaban untuk menggunakan UITextViewalih-alih UITextfielduntuk tujuan ini.

raaz
sumber
Ini adalah kontrol kecil yang saya tulis persis untuk tujuan itu. ini memiliki dukungan multiline dan juga tombol Selesai untuk menutup keyboard. jangan ragu untuk menggunakannya code.google.com/p/galtextfield
Gal Blank
2
gunakan kelas pihak ketiga ini untuk mengimpor proyek xcode Anda dan menggunakannya, tautannya berfungsi terlalu baik: github.com/adonoho/HPGrowingTextView
mahesh chowdary

Jawaban:

435

UITextField khusus satu-line saja.

Pencarian Google Anda benar, Anda harus menggunakan UITextViewalih-alih UITextFielduntuk menampilkan dan mengedit teks multiline.

Di Interface Builder, tambahkan UITextViewtempat yang Anda inginkan dan pilih kotak "dapat diedit". Ini akan menjadi multiline secara default.

h4xxr
sumber
7
Jadi tolong beri tahu saya bagaimana aplikasi Kalender asli membuat Tampilan dengan placeholder dan bungkus kata untuk catatan di layar acara tambahan?
Gennadiy Ryabkin
3
cara mengatur placeholder untuk UITextView?
Mani
4
Anda tidak bisa menambahkan placeholder ke TextView, tetapi Anda bisa menambahkan label abu-abu di atas TextView, dan menyembunyikannya jika pengguna memasukkan beberapa teks.
Andrew Romanov
Bisakah ada yang membantu saya dengan pertanyaan berikut? Jika pengguna menulis teks berpoin (beberapa jeda baris) di UITextView, bagaimana cara mendeteksi jumlah total jeda baris?
Markus
@ Markus, Anda harus membuka pertanyaan baru untuk itu
Nathan F.
20

Anda bisa memalsukan UITextField menggunakan UITextView. Masalah yang akan Anda miliki adalah Anda kehilangan fungsionalitas tempat penampung.

Jika Anda memilih untuk menggunakan UITextView dan membutuhkan placeholder, lakukan ini:

Di viewDidLoad Anda, atur warna dan teks ke placeholder:

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

Lalu buat placeholder menghilang ketika UITextView Anda dipilih:

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

Saat pengguna selesai mengedit, pastikan ada nilai. Jika tidak ada, tambahkan placeholder lagi:

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

Fitur lain yang mungkin perlu Anda tiru:

UITextField sering menggunakan huruf kapital untuk setiap huruf, Anda dapat menambahkan fitur itu ke UITableView:

myTxtView.autocapitalizationType = .words

UITextField biasanya tidak menggulir:

myTxtView.scrollEnabled = false
Dave G
sumber
18

Ok saya melakukannya dengan beberapa trik;) Pertama membangun UITextFielddan meningkatkannya sizeseperti ini:

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

Kemudian buat UITextViewpersis di area yang sama dengan yang Anda buat UITextField, dan hapus background color. Sekarang sepertinya kamu memiliki beberapa baris TextField!

Rudi
sumber
2
Saya menggunakan tata letak otomatis dan menyematkan semua sisi UITextField ke UITextView. Trik yang benar-benar hebat, terima kasih!
phatmann
tolong @phantmann, dapatkah Anda menunjukkan kode Anda untuk tata letak otomatis?
Esteve
8
Ini menciptakan a UITextView. Inti dari memiliki UITextField adalah berperilaku berbeda dari a UITextView.
Nate Symer
2
Ada banyak perbedaan antara UITextViewdan UITextfield: mereka mewarisi dari UIScrollViewvs UIControl, tidak-dapat-diedit-oleh-standar vs yang dapat diedit-oleh-standar, multiline vs satu-baris, protokol delegasi yang berbeda, no-placeholder vs placeholder.
Sam Ballantyne
UITextViewadalah untuk paragraf teks. Gunakan jika Anda membutuhkan paragraf teks, dan bukan sebaliknya.
Sam Ballantyne
9

Selain dari perilaku beberapa baris, perbedaan utama antara UITextView dan UITextField adalah bahwa UITextView tidak mengusulkan placeholder. Untuk melewati batasan ini, Anda dapat menggunakan UITextView dengan "placeholder palsu."

Lihat pertanyaan SO ini untuk detail: Placeholder di UITextView .

MonsieurDart
sumber
2

Jika Anda harus memiliki UITextField dengan 2 baris teks, satu opsi adalah menambahkan UILabel sebagai subview dari UITextField untuk baris teks kedua. Saya memiliki UITextField di aplikasi saya yang seringkali tidak disadari pengguna dapat diedit dengan mengetuk, dan saya ingin menambahkan beberapa teks subtitle kecil yang bertuliskan "Ketuk untuk Mengedit" ke 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
sumber
2

Ya, UITextView adalah yang Anda cari. Anda harus berurusan dengan beberapa hal secara berbeda (seperti tombol kembali) tetapi Anda dapat menambahkan teks ke dalamnya, dan itu akan memungkinkan Anda untuk menggulir ke atas dan ke bawah jika ada terlalu banyak teks di dalamnya.

Tautan ini memiliki info tentang cara membuat layar untuk memasukkan data:

buat layar entri data

raja nevan
sumber
1

gunakan UITextView bukan UITextField

Monir Khlaf
sumber
0

Tambahan untuk jawaban h4xxr di atas, cara yang lebih mudah untuk menyesuaikan ketinggian UITextField adalah dengan memilih gaya batas persegi di atribut inspektur-> Text Field. (Secara default, gaya perbatasan dari UITextfield adalah elips.)

Referensi: Dijawab Brian di sini: Cara mengatur ketinggian UITextField?

Tony
sumber
-1

Ada opsi lain yang berfungsi untuk saya:

Subkelas UITextField dan timpa:

- (void)drawTextInRect:(CGRect)rect

Dalam metode ini Anda dapat misalnya:

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

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

Kode ini akan membuat teks menggunakan baris sebanyak yang diperlukan jika kotak memiliki ruang yang cukup. Anda dapat menentukan atribut lainnya tergantung pada kebutuhan Anda.

Jangan gunakan:

self.defaultTextAttributes

yang akan memaksa rendering teks satu baris

McFlys
sumber