Saya memiliki UILabel
yang bisa bervariasi panjangnya tergantung pada apakah aplikasi saya berjalan dalam mode potret atau lanskap di iPhone atau iPad. Ketika teks terlalu panjang untuk ditampilkan pada satu baris dan terpotong, saya ingin pengguna dapat menekannya dan mendapatkan sembulan teks lengkap.
Bagaimana cara memeriksa untuk melihat apakah UILabel
teks tersebut dipotong? Apakah itu mungkin? Saat ini saya hanya memeriksa panjang yang berbeda berdasarkan mode apa yang saya gunakan tetapi tidak berfungsi dengan sangat baik.
UILabel
API.Jawaban:
Anda dapat menghitung lebar string dan melihat apakah lebarnya lebih besar dari
label.bounds.size.width
NSString UIKit Additions memiliki beberapa metode untuk menghitung ukuran string dengan font tertentu. Namun, jika Anda memiliki minimumFontSize untuk label Anda yang memungkinkan sistem untuk mengecilkan teks ke ukuran tersebut. Anda mungkin ingin menggunakan sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode: dalam kasus tersebut.
sumber
numberOfLines
mengembalikan jumlah baris maksimum yang digunakan untuk menampilkan teks seperti yang diuraikan dalamUILabel
referensi kelas: developer.apple.com/library/ios/documentation/UIKit/Reference/…Swift (sebagai ekstensi) - berfungsi untuk uilabel multi baris:
swift4: (
attributes
parameterboundingRect
berubah sedikit)swift3:
swift2:
sumber
EDIT: Saya baru saja melihat jawaban saya diberi suara positif, tetapi cuplikan kode yang saya berikan sudah usang.
Sekarang cara terbaik untuk melakukan ini adalah (ARC):
Perhatikan bahwa ukuran yang dihitung bukanlah nilai integer. Jadi jika Anda melakukan hal-hal seperti itu
int height = rect.size.height
, Anda akan kehilangan beberapa presisi floating point dan mungkin mendapatkan hasil yang salah.Jawaban lama (tidak digunakan lagi):
Jika label Anda multiline, Anda dapat menggunakan kode ini:
sumber
Anda dapat membuat kategori dengan UILabel
sumber
textRectForBounds:limitedToNumberOfLines:
"Anda tidak harus memanggil metode ini secara langsung" ...setNeedsLayout()
layoutIfNeeded()
di awal metode.Gunakan kategori ini untuk mengetahui apakah label terpotong di iOS 7 dan di atasnya.
sumber
Cepat 3
Anda dapat menghitung jumlah baris setelah menetapkan string dan membandingkannya dengan jumlah baris maksimum pada label.
sumber
Untuk menambah jawaban iDev , Anda harus menggunakan,
intrinsicContentSize
bukanframe
, agar berfungsi untuk Autolayoutsumber
Ini dia. Ini bekerja dengan
attributedText
, sebelum kembali ke polostext
, yang sangat masuk akal bagi kami orang-orang yang berurusan dengan banyak jenis font, ukuran, dan bahkan NSTextAttachments!Berfungsi dengan baik dengan autolayout, tetapi jelas batasan harus ditentukan dan disetel sebelum kita memeriksa
isTruncated
, jika tidak label itu sendiri bahkan tidak akan tahu bagaimana menata dirinya sendiri, jadi tidak mungkin ia akan tahu jika terpotong.Tidak berhasil untuk mendekati masalah ini hanya dengan polos
NSString
dansizeThatFits
. Saya tidak yakin bagaimana orang mendapatkan hasil positif seperti itu. BTW, seperti yang disebutkan berkali-kali, menggunakansizeThatFits
tidak ideal sama sekali karena memperhitungkannumberOfLines
ukuran yang dihasilkan, yang mengalahkan seluruh tujuan dari apa yang kami coba lakukan, karenaisTruncated
akan selalu kembalifalse
terlepas dari apakah terpotong atau tidak.sumber
Inilah jawaban yang dipilih di Swift 3 (sebagai ekstensi). OP menanyakan tentang 1 baris label. Banyak dari jawaban cepat yang saya coba di sini khusus untuk label multi-baris dan tidak ditandai dengan benar pada label baris tunggal.
sumber
Ini berfungsi untuk iOS 8:
sumber
Saya telah menulis kategori untuk bekerja dengan pemotongan UILabel. Berfungsi di iOS 7 dan lebih baru. Semoga membantu! pemotongan ekor uilabel
sumber
Anda dapat menghitung lebar string dan melihat apakah lebarnya lebih besar dari lebar label.
sumber
Untuk menambah apa yang dilakukan @iDev , saya memodifikasi
self.frame.size.height
untuk menggunakanlabel.frame.size.height
dan juga tidak menggunakanNSStringDrawingUsesLineFontLeading
. Setelah modifikasi tersebut, saya mencapai perhitungan sempurna tentang kapan pemotongan akan terjadi (setidaknya untuk kasus saya).sumber
Saya mengalami masalah
boundingRect(with:options:attributes:context:)
saat menggunakan autolayout (untuk menyetel tinggi maksimal) dan teks yang dikaitkan denganNSParagraph.lineSpacing
Jarak antar baris diabaikan (bahkan ketika diteruskan
attributes
keboundingRect
metode) sehingga label mungkin dianggap tidak terpotong ketika itu.Solusi yang saya temukan adalah dengan menggunakan
UIView.sizeThatFits
:sumber
Karena semua jawaban di atas menggunakan metode depresiasi, saya pikir ini bisa berguna:
sumber
Untuk menangani iOS 6 (ya, beberapa dari kita masih harus), berikut ekspansi lain untuk jawaban @ iDev. Kuncinya adalah, untuk iOS 6, untuk memastikan numberOfLines UILabel Anda disetel ke 0 sebelum memanggil sizeThatFits; jika tidak, itu akan memberi Anda hasil yang mengatakan "poin untuk menggambar ketinggian numberOfLines" diperlukan untuk menggambar teks label.
sumber
Pastikan untuk memanggil salah satu dari ini di viewDidLayoutSubviews.
sumber
SWIFT 5
Contoh UILabel dengan banyak baris yang diset untuk menampilkan hanya 3 baris.
Meskipun pengguna dapat memilih tombol kembali dengan menambahkan baris tambahan tanpa menambahkan ke "lebar teks" dalam hal ini sesuatu seperti ini mungkin juga berguna.
sumber
Solusi cepat 3
Saya pikir solusi terbaik adalah (1) membuat
UILabel
dengan properti yang sama dengan label yang Anda periksa pemotongannya, (2) panggilan.sizeToFit()
, (3) membandingkan atribut label tiruan dengan label Anda yang sebenarnya.Misalnya, jika Anda ingin memeriksa apakah satu label berjajar yang memiliki lebar terpotong bervariasi atau tidak, maka Anda dapat menggunakan ekstensi ini:
... tetapi sekali lagi, Anda dapat dengan mudah mengubah kode di atas agar sesuai dengan kebutuhan Anda. Jadi katakanlah label Anda memiliki banyak garis dan memiliki tinggi yang bervariasi. Kemudian ekstensi akan terlihat seperti ini:
sumber
Bukankah mudah untuk mengatur atribut judul untuk label, pengaturan ini akan menampilkan label lengkap saat diarahkan.
Anda dapat menghitung panjang label dan lebar div (dikonversi ke panjang - jQuery / Javascript - Bagaimana cara mengubah nilai piksel (20px) menjadi nilai angka (20) ).
set jquery untuk menyetel judul jika panjangnya lebih besar dari lebar div.
sumber