Saya ingin menempatkan ikon di kiri dua baris teks sehingga ada sekitar 2-3 piksel ruang antara gambar dan awal teks. Kontrol itu sendiri adalah Center aligned secara horizontal (diatur melalui Interface Builder)
Tombolnya akan menyerupai sesuatu seperti ini:
| |
|[Image] Add To |
| Favorites |
Saya mencoba mengkonfigurasi ini dengan contentEdgeInset, imageEdgeInsets, dan titleEdgeInsets tetapi tidak berhasil. Saya mengerti bahwa nilai negatif memperluas tepi sementara nilai positif menyusut untuk memindahkannya lebih dekat ke tengah.
Saya mencoba:
[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, button.titleLabel.bounds.size.width, 0, 0)];
tetapi ini tidak menampilkannya dengan benar. Saya telah mengubah nilai tetapi beralih dari -5 ke -10 pada nilai inset kiri tampaknya tidak memindahkannya dengan cara yang diharapkan. -10 akan menggeser teks ke kiri jadi saya berharap -5 untuk menggesernya setengah jalan dari sisi kiri tetapi tidak.
Apa logika di balik inset? Saya tidak terbiasa dengan penempatan gambar dan terminologi terkait.
Saya menggunakan pertanyaan SO ini sebagai referensi tetapi sesuatu tentang nilai-nilai saya tidak benar. UIButton: bagaimana cara memusatkan gambar dan teks menggunakan imageEdgeInsets dan titleEdgeInsets?
[UIButton setTitleColor:forState:]
, atau bahkan[UIButton setTitle:forState:]
.Saya sedikit terlambat ke pesta ini, tapi saya pikir saya punya sesuatu yang berguna untuk ditambahkan.
Jawaban Kekoa bagus, tetapi, seperti yang disebutkan RonLugge, itu dapat membuat tombol tidak lagi menghormati
sizeToFit
atau, yang lebih penting, dapat menyebabkan tombol untuk klip kontennya ketika itu ukuran intrinsik. Astaga!Pertama,
Penjelasan singkat tentang bagaimana saya percaya
imageEdgeInsets
dantitleEdgeInsets
bekerja:The docs untuk
imageEdgeInsets
memiliki berikut untuk mengatakan, sebagian:Saya percaya bahwa dokumentasi ini ditulis membayangkan bahwa tombol tidak memiliki judul, hanya gambar. Itu jauh lebih masuk akal memikirkan cara ini, dan berperilaku seperti
UIEdgeInsets
biasanya. Pada dasarnya, bingkai gambar (atau judul, dengantitleEdgeInsets
) dipindahkan ke dalam untuk insets positif dan ke luar untuk insets negatif.Oke, lalu bagaimana?
Saya akan ke sana! Inilah yang Anda miliki secara default, mengatur gambar dan judul (batas tombol berwarna hijau hanya untuk menunjukkan di mana itu):
Saat Anda ingin mengatur jarak antara gambar dan judul, tanpa menyebabkan keduanya hancur, Anda perlu mengatur empat inset yang berbeda, dua di setiap gambar dan judul. Itu karena Anda tidak ingin mengubah ukuran bingkai elemen-elemen itu, tetapi hanya posisi mereka. Ketika Anda mulai berpikir seperti ini, perubahan yang diperlukan untuk kategori luar biasa Kekoa menjadi jelas:
Tapi tunggu , Anda berkata, ketika saya melakukan itu, saya mendapatkan ini:
Oh ya! Saya lupa, dokter memperingatkan saya tentang ini. Mereka mengatakan, sebagian:
Tapi ada adalah properti yang dapat bantuan, dan bahwa itu
contentEdgeInsets
. Dokumen untuk itu mengatakan, sebagian:Boleh juga. Jadi mari kita ubah kategori sekali lagi:
Dan apa yang kamu dapat?
Sepertinya pemenang bagi saya.
Bekerja di Swift dan tidak ingin berpikir sama sekali? Ini versi terakhir ekstensi di Swift:
sumber
intrinsicContentSize
yang salah, yang sangat penting di hari-hari tata letak otomatis ini sejak jawaban awal diterima.spacing
ke masing-masing empat nilai-nilai self.contentEdgeInsets, seperti:self.contentEdgeInsets = UIEdgeInsetsMake(spacing, spacing + insetAmount, spacing, spacing + insetAmount);
Dalam antarmuka Builder. Pilih UIButton -> Attributes Inspector -> Edge = Judul dan modifikasi insets tepi
sumber
Juga jika Anda ingin membuat sesuatu yang mirip
Kamu butuh
1. Atur penyelarasan horizontal dan vertikal untuk tombol
Temukan semua nilai yang dibutuhkan dan atur
UIImageEdgeInsets
Ini akan mengatur judul dan gambar Anda pada tombol.
Perhatikan juga perbarui ini pada setiap relayout
Cepat
sumber
Anda dapat menghindari banyak masalah dengan menggunakan ini -
Ini akan menyelaraskan semua konten Anda secara otomatis ke kiri (atau di mana pun Anda inginkan)
Swift 3:
sumber
Di Xcode 8.0 Anda cukup melakukannya dengan mengubah
insets
inspektur ukuran.Pilih tombol UIB -> Atribut Inspektur -> buka pemeriksa ukuran dan modifikasi inset konten, gambar, dan judul.
Dan jika Anda ingin mengubah gambar di sisi kanan, Anda cukup mengubah properti semantik ke
Force Right-to-left
dalam Atribut inspector.sumber
Saya agak terlambat ke pesta ini juga, tapi saya rasa saya punya sesuatu yang berguna untuk ditambahkan: o).
Saya membuat
UIButton
subclass yang tujuannya adalah untuk dapat memilih di mana gambar tombol adalah tata letak, baik secara vertikal maupun horizontal.Ini berarti Anda dapat membuat tombol semacam ini:
Di sini detail tentang cara membuat tombol ini dengan kelas saya:
Untuk melakukan itu, saya menambahkan 2 atribut:
imageVerticalAlignment
danimageHorizontalAlignment
. Tentu saja, Jika tombol Anda hanya memiliki gambar atau judul ... jangan gunakan kelas ini sama sekali!Saya juga menambahkan atribut bernama
imageToTitleSpacing
yang memungkinkan Anda untuk menyesuaikan ruang antara judul dan gambar.Kelas ini mencoba yang terbaik agar kompatibel jika Anda ingin menggunakan
imageEdgeInsets
,titleEdgeInsets
dancontentEdgeInsets
langsung atau dikombinasikan dengan atribut tata letak baru.Sebagai @ravron menjelaskan kepada kami, saya mencoba yang terbaik untuk membuat tepi konten tombol yang benar (seperti yang Anda lihat dengan batas merah).
Anda juga dapat menggunakannya di Interface Builder:
Berikut kodenya ( inti ):
sumber
error: IB Designables: Failed to update auto layout status: The agent crashed
, gist.github.com/nebiros/ecf69ff9cb90568edde071386c6c4ddberror: IB Designables: Failed to update auto layout status: The agent crashed
karenainit(frame: CGRect)
tidak ditimpa, juga, saya menambahkan@available
anotasi ..., Anda dapatdiff -Naur
jika Anda mau, ;-)Tambahan kecil untuk jawaban Riley Avron untuk perubahan lokal akun:
sumber
Swift 4.x
Penggunaan :
sumber
Saya menulis kode bewlow. Ini berfungsi dengan baik dalam versi produk. Supprot Swift 4.2 +
sumber
Berikut adalah contoh sederhana tentang cara menggunakan imageEdgeInsets. Ini akan membuat tombol 30x30 dengan area hittable 10 piksel lebih besar di sekelilingnya (50x50)
sumber
Cara yang elegan di Swift 3 dan lebih baik untuk dipahami:
sumber
Solusi versi 4.2 yang cepat adalah sebagai berikut:
sumber