Aplikasi saya menggunakan UITextView
. Sekarang saya ingin UITextView
memiliki tempat penampung yang serupa dengan yang Anda dapat tetapkan untuk UITextField
.
Bagaimana cara melakukannya?
ios
objective-c
cocoa-touch
uitextview
placeholder
pengguna142019
sumber
sumber
UITextView
solusinya menjadi sangat berbeda. Berikut adalah beberapa solusi. Floating Placeholder dan Palsu Asli PlaceholderJawaban:
Saya membuat beberapa modifikasi kecil pada solusi bcd untuk memungkinkan inisialisasi dari
Xib
file, pembungkus teks, dan mempertahankan warna latar belakang. Semoga itu akan menyelamatkan orang lain dari masalah.UIPlaceHolderTextView.h:
UIPlaceHolderTextView.m:
sumber
Cara mudah, cukup buat teks placeholder
UITextView
dengan menggunakanUITextViewDelegate
metode berikut :hanya ingat untuk mengatur
myUITextView
dengan teks yang tepat pada kreasi misalnyadan membuat kelas induk
UITextViewDelegate
sebelum memasukkan metode ini misalnyaKode untuk Swift 3.1
hanya ingat untuk mengatur
myUITextView
dengan teks yang tepat pada kreasi misalnyadan membuat kelas induk
UITextViewDelegate
sebelum memasukkan metode ini misalnyasumber
text
atribut textview yang agak bagus .. Di mana metode ini memodifikasinyaSaya tidak terlalu senang dengan solusi yang diposting karena mereka agak berat. Menambahkan tampilan ke tampilan tidak terlalu ideal (terutama di
drawRect:
). Mereka berdua mengalami kebocoran, yang juga tidak dapat diterima.Inilah solusi saya: SAMTextView
SAMTextView.h
SAMTextView.m
Ini jauh lebih sederhana daripada yang lain, karena tidak menggunakan subview (atau memiliki kebocoran). Jangan ragu untuk menggunakannya.
Pembaruan 11/10/11: Sekarang telah didokumentasikan dan mendukung penggunaan di Interface Builder.
Pembaruan 11/24/13: Arahkan ke repo baru.
sumber
setText
untuk juga memperbarui placeholder ketika mengubah properti teks secara terprogram: - (void) setText: (NSString *) string {[super setText: string]; [self _updateShouldDrawPlaceholder]; }notification
argumen salah eja dalam metode terakhir, meskipun, dan itu perubahan terlalu kecil untuk mengirimkan sebagai edit.Saya menemukan diri saya cara yang sangat mudah untuk meniru place-holder
Edit:
Pernyataan if yang diubah untuk membandingkan tag dan bukan teks. Jika pengguna menghapus teks mereka, mungkin juga secara tidak sengaja menghapus sebagian tempat
@"Foobar placeholder"
penampung. Ini berarti jika pengguna memasukkan kembali textView dengan metode delegasi berikut-(BOOL) textViewShouldBeginEditing:(UITextView *) textView
,, itu tidak akan berfungsi seperti yang diharapkan. Saya mencoba membandingkan dengan warna teks dalam pernyataan if tetapi menemukan bahwa warna abu-abu muda yang diatur dalam pembuat antarmuka tidak sama dengan warna abu-abu muda yang diatur dalam kode dengan[UIColor lightGreyColor]
Dimungkinkan juga untuk mereset teks placeholder ketika keyboard kembali dan [textView length] == 0
EDIT:
Untuk memperjelas bagian terakhir - inilah cara Anda dapat mengatur teks placeholder kembali:
sumber
Yang dapat Anda lakukan adalah mengatur tampilan teks dengan beberapa nilai awal di
text
properti, dan mengubahtextColor
ke[UIColor grayColor]
atau sesuatu yang serupa. Kemudian, setiap kali tampilan teks menjadi dapat diedit, hapus teks dan sajikan kursor, dan jika bidang teks pernah kosong lagi, kembalikan teks placeholder Anda. Ubah warnanya[UIColor blackColor]
sesuai kebutuhan.Ini tidak persis sama dengan fungsionalitas placeholder di UITextField, tapi dekat.
sumber
Anda dapat mengatur label pada
UITextView
olehdan sembunyikan di
TextViewdidChange
metode.Ini adalah cara sederhana & mudah.
sumber
Jika seseorang membutuhkan Solusi untuk Swift:
Tambahkan UITextViewDelegate ke kelas Anda
sumber
Sederhana Swift 3 solusi
Tambahkan
UITextViewDelegate
ke kelas AndaSet
yourTextView.delegate = self
Buat
placeholderLabel
dan posisikan di dalamyourTextView
Sekarang hanya hidupkan
placeholderLabel.alpha
padatextViewDidChange
:Anda mungkin harus bermain dengan
placeholderLabel
posisi untuk mengaturnya dengan benar, tetapi itu seharusnya tidak terlalu sulitsumber
let alpha = CGFloat(textView.text.isEmpty ? 1.0 : 0.0) if alpha != lblPlaceholder.alpha { UIView.animate(withDuration: 0.3) { self.lblPlaceholder.alpha = alpha } }
Saya memperluas jawaban KmKndy, sehingga placeholder tetap terlihat sampai pengguna mulai mengedit,
UITextView
bukan hanya mengetuknya. Ini mencerminkan fungsi di aplikasi Twitter dan Facebook. Solusi saya tidak mengharuskan Anda untuk subkelas dan berfungsi jika pengguna mengetik secara langsung atau menempelkan teks!hanya ingat untuk mengatur myUITextView dengan teks yang tepat pada kreasi misalnya
dan buat kelas induk sebagai delegasi UITextView sebelum memasukkan metode ini, mis
sumber
Saya sarankan untuk digunakan
SZTextView
.https://github.com/glaszig/SZTextView
Tambahkan default Anda
UITextView
daristoryboard
dan kemudian ubah kelas kustom menjadiSZTextView
seperti di bawah ini 👇👇👇👇Maka Anda akan melihat dua opsi baru di
Attribute Inspector
👇👇👇👇sumber
Di bawah ini adalah port Swift dari "SAMTextView" kode ObjC yang diposting sebagai salah satu dari segelintir balasan pertama untuk pertanyaan tersebut. Saya mengujinya di iOS 8. Saya men-tweak beberapa hal, termasuk batas offset untuk penempatan teks placeholder, karena aslinya terlalu tinggi dan terlalu jauh ke kanan (digunakan saran di salah satu komentar untuk posting itu).
Saya tahu ada banyak solusi sederhana, tapi saya suka pendekatan subclassing UITextView karena dapat digunakan kembali dan saya tidak perlu mengacaukan kelas yang menggunakannya dengan mekanisme.
Swift 2.2:
Swift 4.2:
sumber
beginilah cara saya melakukannya:
UITextView2.h
UITextView2.m
sumber
Berikut adalah solusi yang lebih mudah yang berperilaku persis seperti placeholder UITextField tetapi tidak memerlukan menggambar tampilan khusus, atau mengundurkan diri dari responden pertama.
(cek kedua di pernyataan lain apakah untuk kasus di mana tidak ada yang dimasukkan dan pengguna menekan backspace)
Atur saja kelas Anda sebagai UITextViewDelegate. Di viewDidLoad Anda harus menginisialisasi suka
sumber
Hai, Anda dapat menggunakan IQTextView yang tersedia di IQKeyboard Manager. Mudah digunakan dan diintegrasikan, cukup atur kelas tampilan teks Anda ke IQTextView dan Anda dapat menggunakan propertinya untuk mengatur label tempat penampung dengan warna yang Anda inginkan. Anda dapat mengunduh perpustakaan dari IQKeyboardManager
atau Anda dapat menginstalnya dari cocoapods.
sumber
UITextViewDelegate
bekerja dengan baikMaaf menambahkan jawaban lain, Tapi saya baru saja menarik sesuatu seperti ini dan ini menciptakan placeholder jenis UITextField terdekat.
Semoga ini bisa membantu seseorang.
sumber
if(textView.textColor == [UIColor lightGrayColor]){ textView.textColor = [UIColor blackColor]; textView.text = [textView.text substringToIndex: 1];
tidak, karakter pertama yang dimasukkan dalam tampilan teks ditempatkan di akhir teksCara mudah untuk menggunakan ini dalam beberapa baris kode:
Ambil satu label hingga UITextView di .nib menghubungkan label ini ke kode Anda, Setelah itu.
sumber
Saya telah memodifikasi implementasi Sam Soffes untuk bekerja dengan iOS7:
Ingatlah untuk mengatur
_placeholderAttribues = nil
metode yang dapat mengubah font dan hal lain yang mungkin memengaruhi mereka. Anda mungkin juga ingin melewatkan pembuatan kamus atribut "malas" jika itu tidak mengganggu Anda.EDIT:
Ingatlah untuk memanggil setNeedsDisplay dalam versi setBounds yang diganti jika Anda menyukai placeholder agar terlihat bagus setelah animasi autolayout dan sejenisnya.
sumber
Anda juga bisa membuat TextViewWithPlaceholder kelas baru sebagai subclass dari UITextView.
(Kode ini agak kasar - tapi saya pikir ini berada di jalur yang benar.)
Di delegasi Anda, tambahkan ini:
sumber
Saya membuat versi saya sendiri dari subclass dari 'UITextView'. Saya menyukai gagasan Sam Soffes untuk menggunakan notifikasi, tetapi saya tidak menyukai drawRect: ditimpa. Tampak berlebihan bagi saya. Saya pikir saya membuat implementasi yang sangat bersih.
Anda dapat melihat subkelas saya di sini . Proyek demo juga disertakan.
sumber
Utas ini telah memiliki banyak jawaban, tetapi inilah versi yang saya sukai.
Itu memperluas
UITextView
kelas yang sudah ada sehingga mudah digunakan kembali, dan itu tidak mencegat peristiwa sepertitextViewDidChange
(yang dapat merusak kode pengguna, jika mereka sudah mencegat acara ini di tempat lain).Menggunakan kode saya (diperlihatkan di bawah), Anda dapat dengan mudah menambahkan placeholder ke salah satu dari Anda
UITextViews
seperti ini:Saat Anda menetapkan nilai tempat penampung baru ini, itu menambahkan nilai diam-diam
UILabel
di atas AndaUITextView
, lalu sembunyikan / perlihatkan:Oke, untuk melakukan perubahan ini, tambahkan file "UITextViewHelper.h" yang berisi kode ini:
... dan file UITextViewHelper.m yang berisi ini:
Yup, ini banyak kode, tapi begitu Anda sudah menambahkannya ke proyek Anda dan menyertakan file .h ...
... Anda dapat dengan mudah menggunakan placeholder di
UITextViews
.Ada satu gotcha.
Jika kamu melakukan ini:
... placeholder akan muncul di atas teks. Saat Anda menetapkan
text
nilainya, tidak ada notifikasi reguler yang dipanggil, jadi saya tidak tahu cara memanggil fungsi saya untuk memutuskan apakah akan menampilkan / menyembunyikan placeholder.Solusinya adalah dengan mengatur
textValue
daripadatext
:Atau, Anda dapat mengatur
text
nilainya, lalu meneleponcheckIfNeedToDisplayPlaceholder
.Saya suka solusi seperti ini, karena mereka "mengisi celah" antara apa yang Apple berikan kepada kami, dan apa yang sebenarnya kami (sebagai pengembang) butuhkan dalam aplikasi kami. Anda menulis kode ini satu kali, menambahkannya ke perpustakaan Anda dari file "helper" .m / .h, dan, seiring waktu, SDK sebenarnya mulai menjadi kurang membuat frustrasi.
(Saya menulis pembantu serupa untuk menambahkan tombol "jelas" ke UITextViews saya, hal lain yang mengganggu
UITextField
tetapi tidak diUITextView
...)sumber
Pertama-tama ambil label dalam file .h.
Di sini saya ambil
Kemudian di .m di bawah viewDidLoad mendeklarasikannya
textview adalah TextView saya.
Sekarang nyatakan
Dan placeholder Textview Anda siap!
sumber
Saya merekomendasikan penggunaan pod 'UITextView + Placeholder'
pada kode Anda
sumber
letakkan label di atas tampilan teks.
sumber
Tidak mungkin membuat placeholder di UITextView tetapi Anda dapat menghasilkan efek seperti placeholder dengan ini.
ATAU Anda dapat menambahkan label dalam tampilan teks seperti
dan mengatur
sumber
Ini meniru placeholder UITextField dengan sempurna, tempat teks placeholder tetap sampai Anda benar-benar mengetik sesuatu.
sumber
Inilah cara lain untuk melakukannya, yang mereproduksi sedikit lekukan
UITextField
placeholder:Seret ke
UITextField
kanan di bawahUITextView
sehingga sudut kiri atas mereka sejajar. Tambahkan teks placeholder Anda ke bidang teks.Di viewDidLoad, tambahkan:
Kemudian tambahkan:
sumber
Mari kita membuatnya mudah
Buat satu UILabel dan letakkan di tampilan teks Anda (Berikan teks sebagai warna placeholder-set abu-abu - Anda dapat melakukan semua ini di xib Anda) Sekarang di file header Anda mendeklarasikan UILabel dan juga textviewDelegate Sekarang Anda cukup menyembunyikan label ketika Anda mengklik tampilan teks
kode lengkap di bawah ini
tajuk
penerapan
@akhir
Jangan lupa untuk menghubungkan textView dan UILabel ke pemilik file dari xib
sumber
Lihatlah UTPlaceholderTextView .
Ini adalah subkelas UITextView yang nyaman yang mendukung serupa placeholder dengan UITextField. Kekhasan utama:
sumber
Saya membaca semua ini, tetapi datang dengan solusi, Swift 3, yang sangat singkat yang telah bekerja di semua tes saya. Itu bisa bertahan sedikit lebih umum, tetapi prosesnya sederhana. Inilah keseluruhan hal yang saya sebut "TextViewWithPlaceholder".
sumber
layoutSubviews()
langsung. Dan Anda tidak menghapus pengamat NotificationCenter.Saya telah menulis sebuah kelas dengan cepat. Anda dapat mengimpor kelas ini kapan pun diperlukan.
CustomTextView kelas publik: UITextView {
}
sumber