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
dan titleEdgeInsets
bekerja:
The docs untukimageEdgeInsets
memiliki berikut untuk mengatakan, sebagian:
Gunakan properti ini untuk mengubah ukuran dan memposisikan ulang persegi panjang gambar efektif untuk gambar tombol. Anda dapat menentukan nilai yang berbeda untuk masing-masing dari empat inset (atas, kiri, bawah, kanan). Nilai positif menyusut, atau insets, tepi itu — memindahkannya lebih dekat ke tengah tombol. Nilai negatif memperluas, atau mengimbangi, tepi itu.
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, dengan titleEdgeInsets
) 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:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
Tapi tunggu , Anda berkata, ketika saya melakukan itu, saya mendapatkan ini:
Oh ya! Saya lupa, dokter memperingatkan saya tentang ini. Mereka mengatakan, sebagian:
Properti ini hanya digunakan untuk memposisikan gambar selama tata letak. Tombol tidak menggunakan properti ini untuk menentukan intrinsicContentSize
dan sizeThatFits:
.
Tapi ada adalah properti yang dapat bantuan, dan bahwa itu contentEdgeInsets
. Dokumen untuk itu mengatakan, sebagian:
Tombol ini menggunakan properti ini untuk menentukan intrinsicContentSize
dan sizeThatFits:
.
Boleh juga. Jadi mari kita ubah kategori sekali lagi:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
Dan apa yang kamu dapat?
Sepertinya pemenang bagi saya.
Bekerja di Swift dan tidak ingin berpikir sama sekali? Ini versi terakhir ekstensi di Swift:
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}