Untuk apa nilainya, inilah solusi umum untuk memposisikan gambar yang berpusat di atas teks tanpa menggunakan angka ajaib. Perhatikan bahwa kode berikut ini sudah usang dan Anda mungkin harus menggunakan salah satu versi yang diperbarui di bawah ini :
// the space between the image and text
CGFloat spacing = 6.0;
// lower the text and push it left so it appears centered
// below the image
CGSize imageSize = button.imageView.frame.size;
button.titleEdgeInsets = UIEdgeInsetsMake(
0.0, - imageSize.width, - (imageSize.height + spacing), 0.0);
// raise the image and push it right so it appears centered
// above the text
CGSize titleSize = button.titleLabel.frame.size;
button.imageEdgeInsets = UIEdgeInsetsMake(
- (titleSize.height + spacing), 0.0, 0.0, - titleSize.width);
Versi berikut berisi perubahan untuk mendukung iOS 7+ yang telah direkomendasikan dalam komentar di bawah. Saya belum menguji kode ini sendiri, jadi saya tidak yakin seberapa baik kerjanya atau apakah akan rusak jika digunakan di bawah versi iOS sebelumnya.
// the space between the image and text
CGFloat spacing = 6.0;
// lower the text and push it left so it appears centered
// below the image
CGSize imageSize = button.imageView.image.size;
button.titleEdgeInsets = UIEdgeInsetsMake(
0.0, - imageSize.width, - (imageSize.height + spacing), 0.0);
// raise the image and push it right so it appears centered
// above the text
CGSize titleSize = [button.titleLabel.text sizeWithAttributes:@{NSFontAttributeName: button.titleLabel.font}];
button.imageEdgeInsets = UIEdgeInsetsMake(
- (titleSize.height + spacing), 0.0, 0.0, - titleSize.width);
// increase the content height to avoid clipping
CGFloat edgeOffset = fabsf(titleSize.height - imageSize.height) / 2.0;
button.contentEdgeInsets = UIEdgeInsetsMake(edgeOffset, 0.0, edgeOffset, 0.0);
Versi Swift 5.0
extension UIButton {
func alignVertical(spacing: CGFloat = 6.0) {
guard let imageSize = imageView?.image?.size,
let text = titleLabel?.text,
let font = titleLabel?.font
else { return }
titleEdgeInsets = UIEdgeInsets(
top: 0.0,
left: -imageSize.width,
bottom: -(imageSize.height + spacing),
right: 0.0
)
let titleSize = text.size(withAttributes: [.font: font])
imageEdgeInsets = UIEdgeInsets(
top: -(titleSize.height + spacing),
left: 0.0,
bottom: 0.0, right: -titleSize.width
)
let edgeOffset = abs(titleSize.height - imageSize.height) / 2.0
contentEdgeInsets = UIEdgeInsets(
top: edgeOffset,
left: 0.0,
bottom: edgeOffset,
right: 0.0
)
}
}
button.currentTitle
daripadabutton.titleLabel.text
terutama jika teks tombol akan pernah berubah.currentTitle
dihuni segera, sedangkantitleLabel.text
bisa lambat untuk berubah yang dapat menyebabkan insets tidak selaras.Menemukan caranya.
Pertama, konfigurasikan teks
titleLabel
(karena gaya, yaitu tebal, miring, dll). Kemudian, gunakansetTitleEdgeInsets
mempertimbangkan lebar gambar Anda:Setelah itu, gunakan
setTitleEdgeInsets
mempertimbangkan lebar batas teks:Sekarang gambar dan teks akan dipusatkan (dalam contoh ini, gambar muncul di atas teks).
Bersulang.
sumber
Anda dapat melakukannya dengan ekstensi Swift ini, yang sebagian didasarkan pada jawaban Jesse Crossen:
Ini mendefinisikan suatu fungsi
centerLabelVerticallyWithPadding
yang mengatur judul dan gambar insets dengan tepat.Ini juga mengatur contentEdgeInsets, yang saya percaya perlu untuk memastikan itu
intrinsicContentSize
masih berfungsi dengan benar, yang perlu menggunakan Tata Letak Otomatis.Saya percaya semua solusi yang mengelompokkan UIButton secara teknis tidak sah, karena Anda tidak seharusnya membuat subkelas kontrol UIKit. Yaitu, secara teori mereka mungkin melanggar rilis di masa depan.
sumber
Sunting: Diperbarui untuk Swift 3
Jika Anda mencari solusi Swift dari jawaban Jesse Crossen, Anda dapat menambahkan ini ke subkelas UIButton:
sumber
Ada beberapa contoh yang bagus di sini, tetapi saya tidak bisa membuat ini berfungsi dalam semua kasus ketika juga berurusan dengan beberapa baris teks (pembungkus teks). Untuk akhirnya berhasil, saya menggabungkan beberapa teknik:
Saya menggunakan contoh Jesse Crossen di atas. Namun, saya memperbaiki masalah ketinggian teks dan saya menambahkan kemampuan untuk menentukan margin teks horizontal. Margin berguna ketika memungkinkan teks untuk membungkus sehingga tidak menyentuh tepi tombol:
Pastikan Anda menyiapkan label teks untuk dibungkus
Ini sebagian besar akan berfungsi sekarang. Namun, saya memiliki beberapa tombol yang tidak akan membuat gambar mereka dengan benar. Gambar dipindahkan ke jauh ke kanan atau kiri (tidak terpusat). Jadi saya menggunakan teknik menimpa tata letak UIButton untuk memaksa imageView menjadi terpusat.
sumber
Saya membuat metode untuk jawaban @ TodCunningham
sumber
Diperbarui untuk Xcode 11+
Insets yang dijelaskan dalam jawaban asli saya telah dipindahkan ke inspektur ukuran di versi Xcode yang lebih baru. Saya tidak 100% jelas tentang kapan saklar terjadi tetapi pembaca harus meninjau inspektur ukuran jika informasi inset tidak ditemukan dalam atribut inspektur. Di bawah ini adalah contoh layar inset baru (terletak di bagian atas atribut ukuran inspektur pada 11.5).
Jawaban Asli
Tidak ada yang salah dengan jawaban lainnya, namun saya hanya ingin mencatat bahwa perilaku yang sama dapat dicapai secara visual dalam Xcode menggunakan nol baris kode. Solusi ini berguna jika Anda tidak memerlukan nilai yang dihitung atau sedang membangun dengan storyboard / xib (jika tidak solusi lain berlaku).
Catatan - Saya mengerti bahwa pertanyaan OP adalah salah satu yang memerlukan kode. Saya hanya memberikan jawaban ini untuk kelengkapan dan sebagai alternatif logis bagi mereka yang menggunakan storyboard / xibs.
Untuk memodifikasi jarak pada tampilan gambar, judul, dan konten dari suatu tombol menggunakan insets tepi Anda dapat memilih tombol / kontrol dan membuka pemeriksa atribut. Gulir ke bawah ke arah tengah inspektur dan temukan bagian untuk Edge insets.
Seseorang juga dapat mengakses dan memodifikasi insets tepi spesifik untuk tampilan judul, gambar atau konten.
sumber
Jangan melawan sistem. Jika tata letak Anda menjadi terlalu rumit untuk dikelola menggunakan Interface Builder + mungkin beberapa kode konfigurasi sederhana, lakukan tata letak secara manual dengan cara yang lebih sederhana menggunakan
layoutSubviews
- itulah gunanya! Yang lainnya akan berarti peretasan.Buat subkelas UIButton dan timpa
layoutSubviews
metodenya untuk menyelaraskan teks & gambar Anda secara terprogram. Atau gunakan sesuatu seperti https://github.com/nickpaulson/BlockKit/blob/master/Source/UIView-BKAdditions.h sehingga Anda dapat mengimplementasikan layoutSubviews menggunakan blok.sumber
Subkelas UIButton
sumber
Jawaban Jesse Crossen yang diperbarui untuk Swift 4 :
Gunakan cara ini:
sumber
Dengan potongan kode ini, Anda akan mendapatkan sesuatu seperti ini
sumber
Ekstensi UIButton dengan sintaks Swift 3+ :
Jawaban asli: https://stackoverflow.com/a/7199529/3659227
sumber
Hanya sedikit perubahan pada jawaban Jesse Crossen yang membuatnya bekerja sempurna untuk saya:
dari pada:
Saya telah menggunakan ini:
sumber
Menggunakan
button.titleLabel.frame.size.width
berfungsi dengan baik hanya selama label cukup pendek untuk tidak terpotong. Ketika teks label diposisikan terpotong tidak bekerja sekalipun. Pengambilanbekerja untuk saya bahkan ketika teks label terpotong.
sumber
Saya melihat jawaban yang ada tetapi saya juga menemukan bahwa pengaturan bingkai tombol adalah langkah pertama yang penting.
Berikut adalah fungsi yang saya gunakan yang menangani ini:
sumber
Atau Anda bisa menggunakan kategori ini:
sumber
CGSize titleSize = [button.titleLabel.text sizeWithAttributes: @{NSFontAttributeName: button.titleLabel.font}];
Kasing kasus saya membuat inset tidak dapat dikelola:
Inilah yang akhirnya saya lakukan dan saya cukup senang dengan itu:
Buat tombol pada storyboard dengan gambar latar belakang (lingkaran bulat dengan blur dan warna).
Deklarasikan UIImageView di kelas saya:
Buat contoh tampilan gambar di init:
Di viewDidLoad tambahkan layer baru ke tombol untuk tampilan gambar kami dan atur perataan teks:
Dalam metode klik tombol tambahkan gambar overlay yang saya pilih ke tampilan gambar, ukurannya agar sesuai dengan gambar dan pusatkan pada tombol tetapi bergerak ke atas 15 sehingga saya dapat menempatkan teks offset di bawahnya:
Catatan: ceilf () penting untuk memastikannya pada batas piksel untuk kualitas gambar.
sumber
Dengan asumsi bahwa Anda ingin kedua teks dan gambar dipusatkan secara horizontal, gambar di atas teks: Pusatkan teks dari pembangun antarmuka dan tambahkan inset atas (membuat ruang untuk gambar). (biarkan inset kiri ke 0). Gunakan pembangun antarmuka untuk memilih gambar - posisi sebenarnya akan ditetapkan dari kode, jadi jangan khawatir bahwa segala sesuatu tidak akan terlihat baik di IB. Tidak seperti jawaban lain di atas, ini benar-benar berfungsi pada semua versi ios yang saat ini didukung (5,6 dan 7).
Dalam kode, cukup buang ImageView tombol (dengan mengatur gambar tombol ke nol) setelah mengambil gambar (ini juga akan secara otomatis menempatkan teks di tengah, jika perlu dibungkus). Kemudian instantiate ImageView Anda sendiri dengan ukuran dan gambar bingkai yang sama dan posisikan di tengah.
Dengan cara ini Anda masih dapat memilih gambar dari pembangun antarmuka (meskipun tidak akan disejajarkan dalam IB seperti dalam simulator, tetapi sekali lagi, solusi lain tidak kompatibel di semua versi ios yang didukung)
sumber
Saya berjuang untuk menyelesaikan ini karena saya tidak bisa mendapatkan ukuran gambar dan lebar teks pada konstruktor pandangan saya. Dua perubahan kecil pada jawaban Jesse bekerja untuk saya:
Perubahannya adalah:
[NSString sizeWithAttributes]
untuk mendapatkan lebar teks;UIImage
bukanUIImageView
sumber
Ini berfungsi baik untuk saya, untuk beberapa tombol, dengan lebar gambar berbeda dan panjang judul berbeda:
Subkelas
UIButton
sumber
Bekerja dengan baik untuk ukuran tombol 80x80 piksel.
sumber
Saya melakukan beberapa penyesuaian untuk membuat gambar sejajar di tengah horizontal:
sumber
apakah wajib menggunakan insets edge? Jika tidak, Anda dapat mencoba memposisikan hormat ke tampilan orang tua pusat
sumber
Anda perlu memindahkan gambar ke kanan dengan lebar teks. Kemudian pindahkan teks ke kiri dengan lebar gambar.
Kemudian sesuaikan inset atas dan bawah untuk menyesuaikan sumbu Y. Ini mungkin bisa dilakukan secara terprogram juga, tetapi harus konstan untuk ukuran gambar Anda. Sedangkan inset sumbu-X perlu diubah berdasarkan ukuran label teks di setiap tombol.
sumber
Tambahkan kode ini di ekstensi Swift 4.2
sumber
Hanya dengan memasukkan 2 sen saya, ini berhasil bagi saya:
sumber