Saya memiliki kode berikut...
UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];
... idenya adalah bahwa saya dapat memiliki teks multi-baris untuk tombol, tetapi teks selalu dikaburkan oleh backgroundImage dari UIButton. Panggilan logging untuk menunjukkan subview tombol menunjukkan bahwa UILabel telah ditambahkan, tetapi teks itu sendiri tidak dapat dilihat. Apakah ini bug di UIButton atau saya melakukan sesuatu yang salah?
ios
cocoa-touch
uibutton
uikit
Owain Hunt
sumber
sumber
button.titleLabel?.numberOfLines = 0
Jawaban:
Untuk iOS 6 dan di atasnya, gunakan yang berikut ini untuk memungkinkan beberapa baris:
Untuk iOS 5 dan di bawah ini gunakan yang berikut untuk memungkinkan beberapa baris:
2017, untuk iOS9 maju ,
secara umum, lakukan saja dua hal ini:
sumber
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
NSLineBreakMode
, seperti:button.titleLabel?.lineBreakMode = .ByWordWrapping
.Jawaban yang dipilih sudah benar tetapi jika Anda lebih suka melakukan hal semacam ini di Interface Builder Anda dapat melakukan ini:
sumber
titleLabel.textAlignment
denganNumber
nilai1
diUser Defined Runtime Attributed
untuk membuat teks berpusatJika Anda ingin menambahkan tombol dengan judul di tengah dengan beberapa baris, setel pengaturan Pembuat Antarmuka Anda untuk tombol:
[ ]
sumber
Untuk IOS 6:
Sebagai
sudah tidak digunakan lagi di iOS 6 dan seterusnya ..
sumber
NSText.h
dalamFoundation
ada tidak ada yang ditambahkan ditambahkan. Ini tersedia dari 6.0 tetapi tidak usang.button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel?.textAlignment = NSTextAlignment.Center
Untuk menyatakan kembali saran Roger Nolan, tetapi dengan kode eksplisit, ini adalah solusi umum:
sumber
SWIFT 3
sumber
Di Xcode 9.3 Anda bisa melakukannya dengan menggunakan storyboard seperti di bawah ini,
Anda perlu mengatur textignign judul tombol ke tengah
button.titleLabel?.textAlignment = .center
Anda tidak perlu mengatur teks judul dengan baris baru (\ n) seperti di bawah ini,
button.setTitle("Good\nAnswer",for: .normal)
Cukup atur judul,
button.setTitle("Good Answer",for: .normal)
Inilah hasilnya,
sumber
myButton.titleLabel.textAlignment = NSTextAlignmentCenter
pernyataan juga dibutuhkan.Ada cara yang jauh lebih mudah:
(Edit untuk iOS 3 dan yang lebih baru :)
sumber
Rata kiri di iOS7 dengan pembayaran otomatis:
sumber
Saya mempunyai masalah dengan tata letak otomatis, setelah mengaktifkan multi-line hasilnya seperti ini: jadi ukurannya tidak mempengaruhi ukuran tombol yang saya tambahkan berdasarkan (dalam hal ini contentEdgeInsets adalah (10, 10, 10, 10 ) setelah menelepon : semoga membantu Anda (cepat 5.0):
titleLabel
Constraints
contentEdgeInsets
makeMultiLineSupport()
sumber
Pertama-tama, Anda harus menyadari bahwa UIButton sudah memiliki UILabel di dalamnya. Anda dapat mengaturnya menggunakan
–setTitle:forState:
.Masalah dengan contoh Anda adalah bahwa Anda perlu mengatur
numberOfLines
properti UILabel menjadi selain nilai default-nya 1. Anda juga harus meninjaulineBreakMode
properti tersebut.sumber
Bagi mereka yang menggunakan storyboard Xcode 4, Anda dapat mengklik tombol, dan di sebelah kanan panel Utilities di bawah Attributes Inspector, Anda akan melihat opsi untuk Line Break. Pilih Word Wrap, dan Anda harus siap.
sumber
Jawaban di sini memberi tahu Anda cara mencapai judul tombol multiline secara terprogram.
Saya hanya ingin menambahkan bahwa jika Anda menggunakan storyboard, Anda dapat mengetik [Ctrl + Enter] untuk memaksa baris baru pada bidang judul tombol.
HTH
sumber
Anda harus menambahkan kode ini:
sumber
Adapun gagasan Brent tentang menempatkan judul UILabel sebagai pandangan saudara, menurut saya itu bukan ide yang sangat bagus. Saya terus berpikir dalam masalah interaksi dengan UILabel karena peristiwa sentuhannya tidak melewati pandangan UIButton.
Di sisi lain, dengan UILabel sebagai subview dari UIButton, saya cukup nyaman mengetahui bahwa acara sentuh akan selalu disebarkan ke superview UILabel.
Saya memang mengambil pendekatan ini dan tidak melihat adanya masalah yang dilaporkan dengan backgroundImage. Saya menambahkan kode ini dalam -titleRectForContentRect: dari subkelas UIButton tetapi kode tersebut juga dapat ditempatkan dalam menggambar rutin superview UIButton, yang dalam hal ini Anda harus mengganti semua referensi untuk diri sendiri dengan variabel UIButton.
Saya mengambil waktu dan menulis lebih banyak tentang ini di sini . Di sana, saya juga menunjukkan solusi yang lebih pendek, meskipun tidak cukup cocok dengan semua skenario dan melibatkan beberapa pandangan pribadi peretasan. Juga di sana, Anda dapat mengunduh subkelas UIButton yang siap digunakan.
sumber
Jika Anda menggunakan tata-letak otomatis di iOS 6 Anda mungkin juga perlu mengatur
preferredMaxLayoutWidth
properti:sumber
Mengatur lineBreakMode ke NSLineBreakByWordWrapping (baik dalam IB atau kode) membuat label tombol multiline, tetapi tidak memengaruhi bingkai tombol.
Jika tombol memiliki judul dinamis, ada satu trik: letakkan UILabel tersembunyi dengan font yang sama dan ikat tingginya dengan tinggi tombol dengan tata letak; ketika mengatur teks ke tombol dan label dan autolayout akan membuat semua berfungsi.
Catatan
Tinggi ukuran intrinsik tombol satu-baris lebih besar daripada label, sehingga untuk mencegah penyusutan tinggi label itu vertikal Content Hugging Priority harus lebih besar daripada Resistensi Kompresi Konten vertikal tombol.
sumber
Di Swift 5.0 dan Xcode 10.2
Dalam panggilan ViewController Anda seperti ini
sumber
Swift 5, Untuk teks multi-baris dalam UIButton
sumber
Ini bekerja dengan sempurna.
Tambahkan untuk menggunakan ini dengan file konfigurasi seperti Plist, Anda perlu menggunakan CDATA untuk menulis judul multiline, seperti ini:
sumber
Jika Anda menggunakan tata-letak otomatis.
sumber
cepat 4.0
sumber
Saat ini, jika Anda benar-benar membutuhkan hal semacam ini agar dapat diakses di pembuat antarmuka berdasarkan kasus per kasus, Anda dapat melakukannya dengan ekstensi sederhana seperti ini:
Kemudian Anda bisa mengatur numberOfLines sebagai atribut pada setiap subkelas UIButton atau UIButton seolah-olah itu adalah label. Hal yang sama berlaku untuk seluruh host nilai-nilai lain yang biasanya tidak dapat diakses, seperti jari-jari sudut lapisan tampilan, atau atribut bayangan yang dilemparkannya.
sumber
Gulung kelas tombol Anda sendiri. Sejauh ini solusi terbaik dalam jangka panjang. UIButton dan kelas-kelas UIKit lainnya sangat membatasi cara Anda dapat menyesuaikannya.
sumber
sumber
Saya memasukkan jawaban jessecurry ke dalam STAButton yang merupakan bagian dari perpustakaan open source STAC saya . Saat ini saya menggunakannya dalam salah satu aplikasi yang saya kembangkan dan berfungsi untuk kebutuhan saya. Jangan ragu untuk membuka masalah tentang cara memperbaikinya atau mengirim saya permintaan tarik.
sumber
Untuk memperbaiki jarak label judul ke tombol, atur titleEdgeInsets dan properti lainnya sebelum setTitle:
PS Saya menguji setting titleLabel? .TextAlignment tidak perlu dan judulnya rata
.natural
.sumber
Meskipun tidak apa-apa untuk menambahkan subview ke kontrol, tidak ada jaminan itu akan berfungsi, karena kontrol mungkin tidak mengharapkannya ada di sana dan karenanya mungkin berperilaku buruk. Jika Anda dapat melakukannya, cukup tambahkan label sebagai tampilan saudara dari tombol dan atur bingkainya sehingga tumpang tindih tombol; selama itu diatur untuk muncul di atas tombol, tidak ada tombol yang dapat dilakukan akan mengaburkannya.
Dengan kata lain:
sumber
addSubview:
di sini menambahkannya kebutton
superview, sehingga menjadikannya saudara tombol, sehingga mencocokkan pusat mereka benar.