Saat meletakkan label multiline (dengan linebreak diatur ke Word Wrap) ke dalam tampilan stack, label segera kehilangan linebreak dan menampilkan teks label dalam satu baris saja.
Mengapa ini terjadi dan bagaimana cara mempertahankan label multiline dalam tampilan tumpukan?
Jawaban:
Jawaban yang benar ada di sini:
https://stackoverflow.com/a/43110590/566360
UILabel
dalamUIView
(Editor -> Sematkan Dalam -> Tampilan)UILabel
denganUIView
(misalnya, ruang tambahan, ruang atas, dan ruang utama untuk batasan tampilan super)The
UIStackView
akan meregangkanUIView
sesuai dengan benar, danUIView
akan membatasiUILabel
untuk beberapa baris.sumber
UIView
perlu shenanigans.Untuk tampilan tumpukan horizontal yang memiliki
UILabel
salah satu dari pandangannya, di Interface Builder atur terlebih dahululabel.numberOfLines = 0
. Ini harus memungkinkan label memiliki lebih dari 1 baris. Ini awalnya gagal untuk saya ketika tampilan stack sudahstackView.alignment = .fill
. Untuk membuatnya bekerja cukup aturstackView.alignment = .center
. Label sekarang dapat diperluas ke beberapa baris di dalamUIStackView
.The Apple dokumentasi mengatakan
Catat kata kecuali di sini. Ketika
.fill
digunakan, horizontalUIStackView
TIDAK mengubah ukurannya sendiri secara vertikal menggunakan ukuran tampilan sub-tersusun.sumber
.alignment
dari UIStackView yang Anda harus siap untuk apa pun kecuali.fill
tidak UILabel, yang sedikit membingungkan dalam contoh yang diberikanlabel.alignment = .center
. Saya pikir ini seharusnyastackView.alignment = .center
multiLine
kecuali Anda memberinya lebar tetap. Ketika kami memperbaiki lebarnya, maka ia akan pecah menjadi multiline saat lebar itu tercapai seperti yang ditunjukkan:Jika kita tidak memberikan lebar yang tetap pada tampilan stack maka semuanya menjadi ambigu. Berapa lama tampilan tumpukan tumbuh dengan label (jika nilai label dinamis)?
Semoga ini bisa memperbaiki masalah Anda.
sumber
preferredMaxLayoutWidth
dalamviewDidLayoutSubviews
untuk label AndaUIViewController
ataulayoutSubviews
jika Anda subkelasUIView
.Pengaturan preferMaxLayoutWidth ke UILabel bekerja untuk saya
sumber
.center
dan saya benar-benar tidak perlu label saya di dalam UIView.Cukup atur jumlah baris ke 0 di Inspektur atribut untuk label. Ini akan bekerja untuk Anda.
sumber
Setelah mencoba semua saran di atas saya tidak menemukan perubahan properti diperlukan untuk UIStackView. Saya baru saja mengubah properti dari label UIL sebagai berikut (Label sudah ditambahkan ke tampilan tumpukan vertikal):
Contoh Swift 4:
sumber
Trik sulap bagi saya adalah mengatur a
widthAnchor
keUIStackView
.Pengaturan
leadingAnchor
dantrailingAnchor
tidak akan berfungsi, tetapi pengaturancenterXAnchor
danwidthAnchor
membuat tampilan UILabel dengan benar.sumber
iOS 9+
Panggil
[textLabel sizeToFit]
setelah mengatur teks UILabel.sizeToFit akan menata ulang label multiline menggunakan preferMaxWidth. Label akan mengubah ukuran stackView, yang akan mengubah ukuran sel. Tidak ada kendala tambahan selain menyematkan tampilan tumpukan ke tampilan konten.
sumber
Berikut adalah contoh lengkap dari vertikal yang
UIStackView
terbuat dari multilineUILabel
s dengan ketinggian otomatis.Bungkus label berdasarkan lebar stackview dan tinggi stackview didasarkan pada tinggi label yang terbungkus. (Dengan pendekatan ini Anda tidak perlu menyematkan label dalam a
UIView
.) (Swift 5, iOS 12.2)Berikut adalah contoh
ViewController
yang menggunakannya.sumber
Tambahkan
UIStackView
properti,Alih-alih menambahkan label di dalam
UIView
yang tidak diperlukan. Jika Anda menggunakan di dalamUITableViewCell
tolong, muat ulang data secara rotasi.sumber
Berikut ini adalah penerapan Playground label multi-line dengan garis istirahat di dalam a
UIStackView
. Tidak perlu menyematkan bagianUILabel
dalam apa pun dan telah diuji dengan Xcode 9.2 dan Swift 4. Semoga bermanfaat.sumber
Tata letak sistem harus mencari tahu asal, lebar dan tinggi untuk menggambar subview, dalam hal ini semua subview Anda memiliki prioritas yang sama, saat itu membuat konflik, sistem tata letak tidak diketahui ketergantungan antara tampilan, yang mana menggambar pertama, kedua dan seterusnya
Mengatur kompresi subview tumpukan akan menyelesaikan masalah dengan beberapa baris, tergantung pada tampilan tumpukan Anda secara horizontal atau vertikal dan yang Anda inginkan menjadi beberapa baris.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
sumber
Dalam kasus saya, saya mengikuti saran sebelumnya, tetapi teks saya masih terpotong menjadi satu baris meskipun hanya dalam lanskap. Ternyata, saya menemukan
\0
karakter nol yang tidak terlihat dalam teks label yang merupakan biang keladinya. Itu pasti telah diperkenalkan di samping simbol tanda hubung yang saya masukkan. Untuk melihat apakah ini juga terjadi dalam kasus Anda, gunakan View Debugger untuk memilih label Anda dan memeriksa teksnya.sumber
Xcode 9.2:
Cukup atur jumlah baris ke 0. Storyboard akan terlihat aneh setelah mengatur ini. Jangan khawatir menjalankan proyek. Saat menjalankan semuanya akan mengubah ukuran sesuai pengaturan papan cerita Anda. Saya pikir jenis bug di storyboard.
Tips: Atur "jumlah liner ke 0" di yang terakhir. atur ulang ketika Anda ingin mengedit beberapa tampilan lain dan atur ke 0 setelah mengedit.
sumber
Apa yang berhasil untuk saya!
stackview: alignment: fill, distribusi: fill, kendala proporsional width ke superview ex. 0.8,
label: pusat, dan garis = 0
sumber
Untuk siapa saja yang masih tidak bisa membuatnya bekerja. Coba tetapkan Autoshrink dengan Skala Font minimum pada UILabel itu.
Tangkapan layar UILabel Pengaturan autoshrink
sumber
Ini hampir seperti @ Jawaban Andy, tetapi Anda dapat menambahkan
UILabel
ekstra AndaUIStackview
, vertikal bekerja untuk saya.sumber
Bagi saya, masalahnya adalah bahwa ketinggian tampilan tumpukan terlalu pendek. Tampilan label dan stack diatur dengan benar untuk memungkinkan label memiliki beberapa baris, tetapi label adalah korban kompresi konten pertama yang digunakan tampilan stack untuk mendapatkan ketinggiannya cukup kecil.
sumber