Saya punya tempat di UILabel
mana saya ingin menambahkan ruang di bagian atas dan di bagian bawah. Dengan ketinggian minimum dalam batasan saya telah memodifikasinya menjadi:
EDIT: Untuk melakukan ini saya telah menggunakan:
override func drawTextInRect(rect: CGRect) {
var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
Tetapi saya harus menemukan metode yang berbeda karena jika saya menulis lebih dari dua baris masalahnya sama:
Jawaban:
Jika Anda ingin tetap menggunakan UILabel, tanpa mensubclassingnya, Mundi telah memberi Anda solusi yang jelas.
Jika tidak, Anda ingin menghindari membungkus UILabel dengan UIView, Anda bisa menggunakan UITextView untuk mengaktifkan penggunaan UIEdgeInsets (padding) atau subkelas UILabel untuk mendukung UIEdgeInsets.
Menggunakan UITextView hanya perlu menyediakan insets (OBJ-C):
Alternatif, jika Anda subkelas UILabel , contoh untuk pendekatan ini akan menimpa metode drawTextInRect
(OBJ-C)
Anda juga bisa memberikan UILabel subclass baru Anda dengan variabel insets untuk TOP, LEFT, BOTTOM dan RIGHT.
Contoh kode dapat berupa:
In .h (OBJ-C)
Dalam .m (OBJ-C)
EDIT # 1:
Dari apa yang saya lihat, sepertinya Anda harus menimpa intrinsicContentSize dari UILabel saat mensubklasifikasikan.
Jadi Anda harus mengganti intrinsicContentSize seperti:
Dan tambahkan metode berikut untuk mengedit insets Anda, daripada mengeditnya satu per satu:
Ini akan memperbarui ukuran UILabel Anda agar sesuai dengan insets tepi dan mencakup kebutuhan multiline yang Anda maksud.
Edit # 2
Setelah mencari sedikit, saya menemukan Intisari ini dengan IPInsetLabel. Jika tidak ada solusi yang berhasil, Anda bisa mencobanya.
Edit # 3
Ada pertanyaan serupa (duplikat) tentang masalah ini.
Untuk daftar lengkap solusi yang tersedia, lihat jawaban ini: Margin teks UILabel
sumber
Saya sudah mencobanya dengan Swift 4.2 , semoga berhasil untuk Anda!
Atau Anda dapat menggunakan CocoaPods di sini https://github.com/levantAJ/PaddingLabel
pod 'PaddingLabel', '1.2'
sumber
min
Cepat 3
sumber
Anda dapat melakukannya dengan benar dari IB:
sumber
SWIFT 4
Solusi yang mudah digunakan, tersedia untuk semua anak UILabel dalam proyek.
Contoh:
Ekstensi UILabel
sumber
Cukup gunakan
UIView
sebagai superview dan tentukan margin tetap pada label dengan tata letak otomatis.sumber
drawTextInRect
hanya berfungsi untuk 1 baris,intrinsicContentSize
tidak bekerja dengan padding horizontal. Bungkus UILabel di dalam UIView adalah cara yang baik untuk pergiCukup gunakan UIButton, yang sudah ada di dalamnya. Matikan semua fitur tombol tambahan dan Anda memiliki label yang dapat Anda setel pada instet tepi.
sumber
isUserInteractionEnabled = false
berguna untuk menonaktifkannya.Tanpa Storyboard:
Pemakaian:
Hasil:
sumber
Padding a
UILabel
, solusi lengkap. Diperbarui untuk 2020.Ternyata ada tiga hal yang harus dilakukan.
1. Harus memanggil textRect # forBounds dengan ukuran baru yang lebih kecil
2. Harus mengganti drawText dengan ukuran baru yang lebih kecil
3. Jika sel berukuran dinamis, harus menyesuaikan intrinsicContentSize
Dalam contoh khas di bawah ini, unit teks dalam tampilan tabel, tampilan tumpukan atau konstruksi serupa, yang memberikan lebar tetap . Dalam contoh ini kami ingin menambahkan 60,20,20,24.
Jadi, kita ambil intrinsicContentSize "yang ada" dan benar-benar menambahkan 80 ke ketinggian .
Mengulang ...
Saya menemukan proses itu membingungkan, tetapi, itulah cara kerjanya. Bagi saya, Apple harus mengekspos panggilan bernama "perhitungan tinggi pendahuluan".
Kedua, kita harus benar-benar menggunakan panggilan textRect # forBounds dengan ukuran baru yang lebih kecil .
Jadi dalam textRect # forBounds kita pertama membuat ukuran yang lebih kecil dan kemudian memanggil super.
Waspada! Anda harus menelepon super setelah , bukan sebelumnya!
Jika Anda hati-hati menyelidiki semua upaya dan diskusi di halaman ini, itulah masalah yang sebenarnya. Perhatikan beberapa solusi "tampaknya hampir berhasil" tetapi kemudian seseorang akan melaporkan bahwa dalam situasi tertentu itu tidak akan berhasil. Ini memang alasan yang tepat - membingungkan Anda harus "memanggil super sesudahnya", bukan sebelumnya.
Jadi, jika Anda memanggil super itu "dalam urutan yang salah", biasanya berfungsi, tetapi tidak untuk panjang teks tertentu tertentu .
Berikut ini adalah contoh visual yang tepat dari "salah melakukan super pertama":
Perhatikan bahwa margin 60,20,20,24 sudah benar TETAPI perhitungan ukurannya sebenarnya salah, karena dilakukan dengan pola "super first" di textRect # forBounds.
Tetap:
Perhatikan bahwa hanya sekarang mesin textRect # forBounds tahu cara melakukan perhitungan dengan benar :
Akhirnya!
Sekali lagi, dalam contoh ini, UILabel digunakan dalam situasi tipikal di mana lebar ditetapkan. Jadi dalam intrinsicContentSize kita harus "menambahkan" tinggi ekstra keseluruhan yang kita inginkan. (Anda tidak perlu "menambahkan" dengan cara apa pun ke lebar, itu akan menjadi tidak berarti karena sudah diperbaiki.)
Kemudian di textRect # forBounds Anda mendapatkan batasan "disarankan sejauh ini" dengan autolayout, Anda kurangi margin Anda, dan hanya dengan itu memanggil lagi ke mesin textRect # forBounds, yaitu di super, yang akan memberi Anda hasil.
Akhirnya dan cukup di drawText Anda tentu saja menggambar di kotak kecil yang sama.
Fiuh!
Sekali lagi. Perhatikan bahwa jawaban pada QA ini dan lainnya yang "hampir" benar mengalami masalah pada gambar pertama di atas - "super ada di tempat yang salah" . Anda harus memaksa ukuran lebih besar di intrinsicContentSize dan kemudian di textRect # forBounds Anda harus terlebih dahulu mengecilkan batas saran pertama dan kemudian memanggil super.
Ringkasan: Anda harus "memanggil super terakhir " di textRect # forBounds
Itulah rahasianya.
Perhatikan bahwa Anda tidak perlu dan tidak perlu memanggil tambahan yang tidak valid, sizeThatFits, needsLayout atau panggilan pemaksaan lainnya. Solusi yang benar harus bekerja dengan baik dalam siklus penarikan autolayout normal.
Tip:
Jika Anda bekerja dengan font monospace, inilah tip yang bagus: https://stackoverflow.com/a/59813420/294884
sumber
Swift 4+
pemakaian:
sumber
Kode Swift 3 dengan Contoh Implementasi
Jangan lupa untuk menambahkan nama kelas UIMarginLabel di objek label storyboard. Selamat Coding!
sumber
Sesuai Swift 4.2 (Xcode 10 beta 6) "UIEdgeInsetsInsetRect" tidak digunakan lagi. Saya juga telah mengumumkan kelas publik untuk membuatnya lebih bermanfaat.
sumber
sizeToFit()
harus dipublikasikan sebagai: "Metode instance utama harus dapat diakses seperti jenis terlampirnya"Saya mengedit sedikit jawaban yang diterima. Ada masalah ketika
leftInset
danrightInset
meningkat, sebagian teks akan hilang, b / c lebar label akan dipersempit tetapi tingginya tidak bertambah seperti gambar:Untuk mengatasi masalah ini, Anda perlu menghitung ulang ketinggian teks sebagai berikut:
dan hasil:
Saya berharap dapat membantu beberapa orang dalam situasi yang sama dengan saya.
sumber
override func drawTextInRect(rect: CGRect)
jadilahoverride func drawText(in rect: CGRect)
danoverride func intrinsicContentSize() -> CGSize
menjadioverride var intrinsicContentSize : CGSize
Nikmati!override var intrinsicContentSize: CGSize { // .. return intrinsicSuperViewContentSize }
Cukup gunakan autolayout:
Selesai
sumber
Pilihan lain tanpa subclass adalah:
text
sizeToFit()
lalu tambah tinggi label sedikit untuk mensimulasikan bantalan
sumber
label.frame = CGRect( x: label.frame.origin.x - 10, y: label.frame.origin.y - 4, width: label.frame.width + 20,height: label.frame.height + 8)
-10 dan -4 untuk pemusatanSwift 3, solusi iOS10:
sumber
Dalam Swift 3
cara terbaik dan sederhana
sumber
Subkelas UILabel. (File-File-Baru- CocoaTouchClass-make Subclass dari UILabel).
Pada ViewController:
ATAU Kaitkan kelas UILabel khusus di Storyboard sebagai kelas Label.
sumber
Sama seperti jawaban lain tetapi perbaiki bug. Ketika
label.width
dikendalikan oleh tata letak otomatis, kadang-kadang teks akan dipotong.sumber
Padding mudah (Swift 3.0, jawaban Alvin George):
sumber
Elaborasi atas jawaban Mundi.
yaitu menempelkan label dalam
UIView
dan menegakkan bantalan melalui Tata Letak Otomatis. Contoh:Gambaran:
1) Buat
UIView
("panel"), dan atur penampilannya.2) Buat
UILabel
dan tambahkan ke panel.3) Tambahkan kendala untuk menegakkan bantalan.
4) Tambahkan panel ke hierarki tampilan Anda, lalu posisikan panel.
Detail:
1) Buat tampilan panel.
2) Buat label, tambahkan ke panel sebagai subview.
3) Tambahkan batasan antara tepi label dan panel. Ini memaksa panel untuk menjaga jarak dari label. yaitu "bantalan"
Editorial: melakukan semua ini dengan tangan super-membosankan, verbal dan rawan kesalahan. Saya sarankan Anda memilih pembungkus Tata Letak Otomatis dari github atau menulis sendiri
4) Tambahkan panel ke hierarki tampilan Anda dan kemudian tambahkan batasan pemosisian. mis. peluk sisi kanan tableViewCell, seperti pada contoh gambar.
Catatan: Anda hanya perlu menambahkan batasan posisi, bukan batasan dimensi: Tata Letak Otomatis akan menyelesaikan tata letak berdasarkan
intrinsicContentSize
label dan batasan yang ditambahkan sebelumnya.sumber
Gunakan kode ini jika Anda menghadapi masalah pemangkasan teks saat menerapkan padding.
sumber
Mirip dengan jawaban lain, tetapi dengan kelas fungsi untuk memasang bantalan secara dinamis:
sumber
Salah satu solusi pragmatis adalah menambahkan label kosong dengan tinggi dan warna yang sama dengan label utama. Atur spasi leading / trailing ke label utama menjadi nol, sejajarkan pusat vertikal, dan buat lebar margin yang Anda inginkan.
sumber
Jika Anda ingin menambahkan padding 2px di sekitar textRect, lakukan saja ini:
sumber
Jika Anda tidak ingin atau perlu menggunakan UILabel @IBInspectable / @IBDesignable di Storyboard (saya pikir itu terlalu lambat), maka lebih bersih menggunakan UIEdgeInsets daripada 4 CGFloats yang berbeda.
Contoh kode untuk Swift 4.2:
sumber
Objektif-C
Berdasarkan jawaban Tai Le di sana yang mengimplementasikan fitur di dalam IB Designable, inilah versi Objective-C.
Letakkan ini di YourLabel.h
Dan ini akan masuk dalam YourLabel.m
Anda kemudian dapat memodifikasi inset YourLabel secara langsung di Interface Builder setelah menentukan kelas di dalam XIB atau storyboard, nilai default inset menjadi nol.
sumber
Jalan mudah
sumber
Padding mudah:
sumber
Swift 4+
sumber