Jika saya memiliki UIButton yang diatur menggunakan autolayout, ukurannya menyesuaikan dengan baik agar sesuai dengan isinya.
Jika saya menetapkan gambar sebagai button.image
, ukuran instrinsik lagi tampaknya bertanggung jawab untuk ini.
Namun, jika saya mengubah titleEdgeInsets
tombol, tata letak tidak memperhitungkan ini dan malah memotong judul tombol.
Bagaimana saya bisa memastikan bahwa lebar intrinsik tombol menyumbang inset?
Edit:
Saya menggunakan yang berikut ini:
[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
Tujuannya adalah untuk menambahkan beberapa pemisahan antara gambar dan teks.
ios
cocoa-touch
uiview
uibutton
autolayout
Ben Packard
sumber
sumber
titleEdgeInset
dokumentasi:The insets you specify are applied to the title rectangle after that rectangle has been sized to fit the button’s text. Thus, positive inset values may actually clip the title text.
Jadi dengan menambahkan inset Anda memaksa tombol untuk klip teks pastinyaJawaban:
Anda dapat menyelesaikan ini tanpa harus menimpa metode apa pun atau menetapkan batasan lebar sewenang-wenang. Anda bisa melakukan semuanya di Interface Builder sebagai berikut.
Lebar tombol intrinsik berasal dari lebar judul ditambah lebar ikon ditambah insets tepi konten kiri dan kanan .
Jika sebuah tombol memiliki gambar dan teks, mereka dipusatkan sebagai grup, tanpa padding di antaranya.
Jika Anda menambahkan inset konten kiri, itu dihitung relatif terhadap teks, bukan ikon teks +.
Jika Anda menetapkan inset gambar kiri negatif, gambar ditarik ke kiri tetapi lebar tombol keseluruhan tidak terpengaruh.
Jika Anda menetapkan inset gambar kiri negatif, tata letak yang sebenarnya menggunakan setengah dari nilai itu. Jadi untuk mendapatkan inset kiri -20 poin, Anda harus menggunakan nilai inset kiri -40 di Interface Builder.
Jadi, Anda memberikan inset konten kiri yang cukup besar untuk menciptakan ruang untuk inset kiri yang diinginkan dan lapisan dalam di antara ikon dan teks, lalu menggeser ikon ke kiri dengan menggandakan jumlah padding yang Anda inginkan antara ikon dan teks. Hasilnya adalah tombol dengan inset konten kiri dan kanan yang sama, dan pasangan teks dan ikon yang dipusatkan sebagai grup, dengan jumlah padding di antaranya.
Beberapa contoh nilai:
sumber
UIButton
.Anda bisa membuatnya berfungsi di Interface Builder (tanpa menulis kode apa pun), dengan menggunakan kombinasi Judul dan Konten Insets negatif dan positif.
Pembaruan : Xcode 7 memiliki bug di mana Anda tidak dapat memasukkan nilai negatif di
Right
bidang Inset, tetapi Anda dapat menggunakan kontrol stepper di sebelahnya untuk mengurangi nilai. (Terima kasih Stuart)Melakukan ini akan menambah jarak 8pt antara gambar dan judul dan akan menambah lebar intrinsik tombol dengan jumlah yang sama. Seperti ini:
sumber
Right
lapangan.Mengapa tidak mengganti
intrinsicContentSize
metode pada UIView? Sebagai contoh:Ini akan memberi tahu sistem autolayout bahwa ia harus menambah ukuran tombol untuk memungkinkan insets dan menampilkan teks lengkap. Saya tidak di komputer saya sendiri, jadi saya belum menguji ini.
sumber
intrinsicContentSize
adalah metode pada UIView, bukan UIButton, jadi Anda tidak akan mengotak-atik metode UIButton apa pun. Apple tidak berpikir itu masalah: "Mengganti metode ini memungkinkan tampilan khusus untuk berkomunikasi dengan sistem tata letak ukuran apa yang ingin didasarkan pada kontennya." Dan OP tidak mengatakan apa-apa tentang tombol yang berbeda, hanya satu.intrinsicContentSize
memang metode di UIView dan UIButton adalah subkelas dari UIView sehingga tentu saja Anda dapat mengganti metode ini; tidak ada dalam dokumen Apple yang mengatakan bahwa Anda tidak boleh. Cukup buat subkelas UIButton menggunakan metode yang diganti Maarten dan ubah UIButton Anda di Interface Builder menjadi tipe YourUIButtonSubclass dan itu akan bekerja dengan sempurna.intrinsicContentSize
untuk UIButton harus menambahkan titleEdgeInsets, saya akan mengajukan bug dengan Apple.Anda belum menentukan bagaimana Anda mengatur insets, jadi saya menduga Anda menggunakan titleEdgeInsets karena saya melihat efek yang sama dengan yang Anda dapatkan. Jika saya menggunakan contentEdgeInsets sebagai gantinya berfungsi dengan baik.
sumber
Dan untuk Swift bekerja ini:
Love U Swift
sumber
Utas ini agak lama, tetapi saya sendiri menabrak ini dan dapat menyelesaikannya dengan menggunakan inset negatif. Misalnya, gantikan nilai padding yang Anda inginkan di sini:
Dikombinasikan dengan batasan autolayout yang tepat, Anda akan mendapatkan tombol ubah ukuran otomatis yang berisi gambar dan teks! Terlihat di bawah dengan
desiredLeftPadding
set ke 10.Anda dapat melihat bahwa bingkai tombol yang sebenarnya tidak mencakup label (karena label digeser 10 poin ke kanan, di luar batas), tetapi kami telah mencapai 10 poin bantalan antara teks dan gambar.
sumber
Untuk Swift 3 berdasarkan jawaban pasak :
sumber
Semua di atas tidak berfungsi untuk iOS 9+ , yang saya lakukan adalah:
Sekarang untuk menambahkan perbatasan di sekitar tombol cukup gunakan metode:
sumber
Saya ingin menambahkan ruang 5pt antara ikon UIButton saya dan labelnya. Beginilah cara saya mencapainya:
Cara contentEdgeInsets, titleEdgeInsets, dan imageEdgeInsets saling berhubungan membutuhkan sedikit memberi dan menerima dari setiap inset. Jadi, jika Anda menambahkan beberapa insets ke kiri judul Anda harus menambahkan inset negatif di sebelah kanan dan memberikan lebih banyak ruang (melalui inset positif) di konten kanan.
Dengan menambahkan inset konten yang tepat agar sesuai dengan pergeseran judul inset, teks saya tidak melampaui batas tombol.
sumber
Opsi ini juga tersedia di pembuat antarmuka. Lihat Inset. Saya mengatur kiri dan kanan ke 3. Bekerja seperti pesona.
sumber
Solusi yang saya gunakan adalah menambahkan batasan lebar pada tombol. Kemudian di suatu tempat di inisialisasi, setelah teks Anda diatur, perbarui batasan lebar seperti:
self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;
Di mana 8 adalah apa pun inset Anda.
sumber
constant
batasan secara manual ke nilai baru ... dan mengetahui kapan ukuran konten intrinsik perubahan tombol sulit. tanpa subklas tombol.setNeedsUpdateConstraints
dapat "secara manual" dilakukan setelah memperbarui judul tombol atau gambar. Anda kemudian dapat mengesampingkanupdateConstraints
dan menghitung ulangbuttonWidthConstraint
konstanta dari sana. Ini belum tentu merupakan pendekatan terbaik tetapi itu bekerja cukup baik untuk saya. YMMV;)memanggil sizeToFit () memastikan bahwa contentEdgeInset diberlakukan
sumber