Di pembangun antarmuka, menahan Command+ =akan mengubah ukuran tombol agar sesuai dengan teksnya. Saya bertanya-tanya apakah ini mungkin dilakukan secara pemrograman sebelum tombol ditambahkan ke tampilan.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal];
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
Jawaban:
Dalam Xcode 4.5 dan di atas, ini sekarang dapat dilakukan dengan menggunakan ' Auto-layouting / Constraints '.
Keuntungan utama adalah:
Beberapa kelemahan:
Yang paling keren adalah kita harus fokus pada menyatakan maksud seperti:
Berikut ini adalah tutorial sederhana untuk diperkenalkan ke tata-letak otomatis.
Untuk lebih jelasnya .
Awalnya memang butuh waktu, tapi sepertinya akan sepadan dengan usahanya.
sumber
Dalam UIKit, ada tambahan untuk kelas NSString untuk mendapatkan dari objek NSString yang diberikan ukurannya akan mengambil ketika dirender dalam font tertentu.
Documents ada di sini . Sekarang di sini di bawah usang.
Singkatnya, jika Anda pergi:
... Anda harus mengatur bingkai tombol dengan tinggi dan lebar string yang Anda render.
Anda mungkin ingin bereksperimen dengan beberapa ruang penyangga di sekitar CGSize itu, tetapi Anda akan mulai di tempat yang tepat.
sumber
Cara melakukannya dalam kode adalah:
Jika Anda subklas dan ingin menambahkan aturan tambahan, Anda dapat mengganti:
sumber
-(CGSize)sizeThatFits:(CGSize)size
.[button setTitle:@"Your text here" forState:UIControlStateNormal];
[button sizeToFit];
Juga jika Anda memperbarui teks nanti, jangan lupa menyebutnya lagi.sizeToFit()
tidak menghormati insets judul tepi.Jika tombol Anda dibuat dengan Interface Builder, dan Anda mengubah judul dalam kode, Anda dapat melakukan ini:
sumber
Cepat:
Yang penting di sini adalah kapan Anda akan memanggil
.sizeToFit()
, itu harus setelah pengaturan teks untuk ditampilkan sehingga dapat membaca ukuran yang dibutuhkan, jika Anda kemudian memperbarui teks, kemudian memanggilnya lagi.sumber
Untuk mencapai ini menggunakan autolayout, coba atur batasan lebar variabel:
Anda mungkin juga perlu menyesuaikan
Content Hugging Priority
danContent Compression Resistance Priority
untuk mendapatkan hasil yang Anda butuhkan.UILabel sepenuhnya otomatis berukuran sendiri :
UILabel ini hanya diatur untuk dipusatkan di layar (hanya dua kendala, horizontal / vertikal):
Ini mengubah lebar total secara otomatis:
Anda tidak perlu mengatur lebar atau tinggi apa pun - ini sepenuhnya otomatis.
Perhatikan kotak kuning kecil hanya terpasang ("jarak" dari nol). Mereka secara otomatis bergerak sesuai ukuran UILabel.
Menambahkan batasan "> =" menetapkan lebar minimum untuk label UIL:
sumber
Jika Anda ingin mengubah ukuran teks sebagai lawan dari tombol, Anda dapat menggunakan ...
sumber
sizeToFit tidak berfungsi dengan benar. sebagai gantinya:
Anda juga dapat menambahkan
contentInset
ke tombol:myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
sumber
Secara sederhana:
UIView
sebagai pembungkus dengan tata letak otomatis untuk dilihat sekitar.UILabel
dalam bungkus itu. Tambahkan batasan yang akan menempel label Anda ke tepi bungkus.UIButton
dalam bungkus Anda, lalu tambahkan batasan yang sama seperti yang Anda lakukan sebelumnyaUILabel
.sumber
Cepat 4.2
Terima kasih Tuhan, ini terpecahkan. Setelah mengatur teks ke tombol, Anda dapat mengambil intrinsicContentSize yang merupakan ukuran alami dari UIView (dokumen resmi ada di sini ). Untuk UIButton, Anda dapat menggunakannya seperti di bawah ini.
Untuk informasi Anda, saya menyesuaikan lebarnya agar terlihat dengan benar.
Simulator
UIButtons dengan intrinsicContentSize
Sumber: https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font
sumber
Saya memiliki beberapa kebutuhan tambahan terkait posting ini yang
sizeToFit
tidak menyelesaikannya. Saya perlu menjaga tombol terpusat di lokasi aslinya, terlepas dari teks. Saya juga tidak pernah ingin tombolnya lebih besar dari ukuran aslinya.Jadi, saya tata letak tombol untuk ukuran maksimumnya, simpan ukuran itu di Controller dan gunakan metode berikut untuk mengukur tombol ketika teks berubah:
sumber
Kelas tombol ini dengan pengatur ketinggian untuk teks (untuk Xamarin tetapi dapat ditulis ulang untuk bahasa lain)
sumber
Untuk beberapa alasan,
func sizeToFit()
tidak berhasil untuk saya. Pengaturan saya adalah saya menggunakan tombol di dalam aUITableViewCell
dan saya menggunakan tata letak otomatis.Apa yang berhasil untuk saya adalah:
intrinsicContentSize
lebar karena menurut dokumen ini tata letak otomatis tidak mengetahuiintrinsicContentSize
. Atur batasan lebar keintrinsicContentSize
lebarInilah dua judul dari
Debug View Hierachry
sumber
Sejujurnya saya pikir itu sangat memalukan bahwa tidak ada kotak centang sederhana di storyboard untuk mengatakan bahwa Anda ingin mengubah ukuran tombol untuk mengakomodasi teks. Yah ... terserahlah.
Berikut adalah solusi paling sederhana menggunakan storyboard.
Tempatkan UILabel di dalam UIView. Tetapkan batasan untuk melampirkannya ke tepi UIView.
Tempatkan UIButton Anda di dalam UIView. Atur batasan yang sama untuk melampirkannya ke tepi UIView.
Set 0 untuk jumlah baris UILabel.
Siapkan gerai.
sumber