Saya ingin menyisipkan teks a UITextField
.
Apakah ini mungkin?
ios
cocoa-touch
uitextfield
RunLoop
sumber
sumber
Jawaban:
Mengesampingkan
-textRectForBounds:
hanya akan mengubah inset teks placeholder. Untuk mengubah inset teks yang dapat diedit, Anda juga harus mengganti-editingRectForBounds:
sumber
UITextField
berada di dalam aUIScrollView
.- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
Ditemukan di sini: stackoverflow.com/questions/5361369/...Saya bisa melakukannya melalui:
Tentu saja ingatlah untuk mengimpor QuartzCore dan juga menambahkan Framework ke proyek Anda.
sumber
UITextField
tumpang tindih konten di sebelah kanannya.Jika Anda hanya membutuhkan margin kiri, Anda dapat mencoba ini:
Ini bekerja untuk saya. Saya harap ini bisa membantu.
sumber
leftView.backgroundColor = textField.backgroundColor;
... Selain itu solusi hebat ... Terima kasih (:Di kelas yang berasal dari UITextField, timpa setidaknya dua metode ini:
Mungkin sesederhana ini jika Anda tidak memiliki konten tambahan:
UITextField menyediakan beberapa metode penentuan posisi yang dapat Anda abaikan.
sumber
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Bagaimana dengan
@IBInspectable
,@IBDesignable
kelas cepat.Anda akan melihat ini di storyboard Anda.
Perbarui - Swift 3
sumber
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
textRect
/editingRect
) memengaruhi kinerja pengguliran (setidaknya di iOS 12), ketika teks meluap kotak yang terlihat. Dengan inset 15 bahkan berhenti bergulir.Jika Anda memiliki tombol yang jelas, jawaban yang diterima tidak akan bekerja untuk Anda. Kita juga harus menjaga agar Apple tidak mengubah hal-hal di masa depan dengan menelepon
super
.Jadi, untuk memastikan teks tidak tumpang tindih tombol yang jelas, mari kita dapatkan nilai 'default' dari
super
pertama, lalu sesuaikan seperlunya.Kode ini akan menambahkan insets 10px di bagian atas, kiri dan bawah bidang teks:
Catatan: UIEdgeInsetsMake mengambil parameter dalam urutan: atas , kiri , bawah , kanan .
sumber
textRectForBounds:
daneditingRectForBounds:
metode tanpaclearButtonRectForBounds:
di iOS 7+ bekerja untuk saya.clearButtonRectForBounds:
hanya membantu mendorong sedikit tombol ke kiri sedikit. Anda mungkin ingin meninggalkannya. Bidang teks saya berada di latar belakang gelap, dan tombol yang jelas membutuhkan sedikit tambahan di sebelah kanan.Pikir saya akan menyediakan Solusi Swift
Swift 3+
sumber
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
textRectForBounds
, placeholder juga terpengaruh - jadi menambahkan placeholder menimpa insets placeholder lain 10pt lebih jauh. Jika itu yang Anda cari, 👍🏼, tetapi jika tidak, ada baiknya Anda waspadai.Menggunakan
textRectForBounds:
adalah pendekatan yang benar. Saya telah membungkus ini dalam subkelas saya sehingga Anda bisa menggunakannyatextEdgeInsets
. Lihat SSTextField .sumber
Cepat
sumber
Untuk orang-orang, yang mencari solusi yang lebih mudah.
Tambahkan bagian
UITextField
dalam aUIView
. Untuk mensimulasikan inset di sekitar bidang teks saya tetap 10 px kiri dan lebarnya 20px kurang dari tampilan. Untuk perbatasan sudut bulat di sekitar bidang teks, gunakan perbatasan tampilansumber
UITextView
mungkin?Anda dapat mengatur inset teks untuk UITextField dengan mengatur leftView.
Seperti ini:
sumber
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
Cepat
sumber
Pendekatan yang baik untuk menambahkan padding ke UITextField adalah dengan subclass UITextField dan menambahkan properti edgeInsets. Anda kemudian mengatur edgeInsets dan UITextField akan ditarik sesuai. Ini juga akan berfungsi dengan benar dengan set custom leftView atau rightView.
OSTextField.h
OSTextField.m
sumber
Swift 3 / Designable in Interface builder / Pisahkan serangga horizontal & vertikal / dapat digunakan di luar kotak
pemakaian:
&
sumber
Saya melakukan ini di IB di mana saya membuat UIView Di belakang textView yang sedikit lebih lama. Dengan warna latar belakang textField diatur ke jelas.
sumber
Ini adalah cara tercepat yang saya temukan tanpa melakukan subclass:
Dalam Swift:
sumber
Berikut adalah subclass yang sama dengan UITextField yang ditulis dalam Swift 3. Ini sangat berbeda dari versi Swift sebelumnya, seperti yang akan Anda lihat:
Kebetulan, Anda juga dapat melakukan sesuatu seperti berikut ini, jika Anda ingin mengontrol inset hanya dari satu sisi. Contoh khusus ini hanya menyesuaikan inset kiri berguna jika Anda menempatkan gambar di atas UITextField tetapi Anda ingin itu muncul kepada pengguna berada di dalam bidang teks:
sumber
Versi Swift 4.2 :
sumber
Anda dapat menyesuaikan posisi teks dalam bidang teks dengan menjadikannya subclass
UITextField
dan menimpa-textRectForBounds:
metode.sumber
Tidak masuk akal Anda harus subclass, karena
UITextField
sudah mengimplementasikan metode, seperti yang ditunjukkan oleh @Adam Waite. Berikut ekstensi cepat yang memperlihatkan metode pabrik, juga tersedia di repo kategori kami :sumber
Saya subclased UITextField untuk menangani ini yang mendukung inset kiri, atas, kanan dan bawah, dan juga pemosisian tombol yang jelas.
MRDInsetTextField.h
MRDInsetTextField.m
Contoh penggunaan di mana * _someTextField * berasal dari tampilan nib / storyboard dengan kelas khusus MRDInsetTextField
sumber
Ini tidak sesingkat contoh lainnya, tetapi mengambil pendekatan yang sama sekali berbeda untuk menyelesaikan masalah ini. Catatan, tanda sisir masih akan mulai rata ke tepi kiri tetapi teks akan indentasi dengan benar ketika diketik / ditampilkan. Ini berfungsi tanpa subklasifikasi jika Anda mencari margin kiri dan Anda sudah menggunakan
UITextFieldDelegate
untuk bidang teks Anda. Anda perlu mengatur atribut teks standar dan atribut pengetikan. Anda menetapkan atribut teks default saat Anda membuat bidang teks. Atribut pengetikan yang perlu Anda atur dalam delegasi. Jika Anda juga menggunakan placeholder, Anda akan ingin mengaturnya ke margin yang sama juga. Secara keseluruhan, Anda mendapatkan sesuatu seperti ini.Pertama buat kategori di
UITextField
kelas.Kemudian, jika Anda menggunakan pemegang yang ditempatkan pastikan untuk menggunakan placeholder yang dikaitkan dengan pengaturan indentasi yang sama. Buat kamus bawaan yang dikaitkan dengan atribut yang tepat, seperti ini:
Kemudian, impor kategori di atas dan setiap kali Anda membuat bidang teks setel indentasi default, delegasikan dan gunakan atribut placeholder default yang ditentukan di atas. Sebagai contoh:
Terakhir, dalam delegasi, implementasikan
textFieldDidBeginEditing
metode, seperti ini:sumber
defaultTextAttributes
berisiNSMutableParagraphStyle
cukup berbahaya .. Saya lebih suka mutableCopy semua ini.Saya biasanya mencoba menghindari subclassing tetapi ini berfungsi jika Anda sudah:
sumber
Untuk melempar solusi lain yang tidak perlu subklas:
Diuji dengan iOS 7 dan iOS 8. Keduanya berfungsi. Masih ada kemungkinan Apple memodifikasi hierarki lapisan UITextField yang mengacaukan segalanya.
sumber
Inilah jawaban Swift komprehensif yang mencakup leftView (ikon kustom) dan tombol hapus kustom, keduanya diatur dalam Interface Builder dengan insets yang dapat disesuaikan.
sumber
Solusi yang benar-benar berfungsi dan mencakup semua kasus:
offsetBy
tidak digunakaninsetBy
.Rect
.Sampel:
sumber
Jika Anda hanya ingin mengubah indentasi TOP dan LEFT saja
// posisi placeholder
// posisi teks
sumber
Solusi cepat tanpa subkelas & juga dapat diperiksa
sumber