Saya tidak ingin menggunakan subview jika saya bisa menghindarinya. Saya ingin UIButton
dengan gambar latar belakang, teks, dan gambar di dalamnya. Saat ini, ketika saya melakukan itu, gambar ada di sisi kiri teks. Gambar latar belakang, teks, dan gambar semuanya memiliki status sorotan yang berbeda.
ios
user-interface
layout
uibutton
jasongregori
sumber
sumber
Jawaban:
Meskipun beberapa jawaban yang disarankan sangat kreatif dan sangat pintar, solusi paling sederhana adalah sebagai berikut:
Sesimpel itu. Sebagai bonus, gambar akan berada di sisi kiri di lokal kanan-ke-kiri.
EDIT : karena pertanyaan telah ditanyakan beberapa kali, ini adalah iOS 9+ .
sumber
semanticContentAttribute
hanyalah hack / solusi, bukan solusi nyata.Solusi paling sederhana:
iOS 10 & lebih tinggi, Swift:
Sebelum iOS 10, Swift / Obj-C:
sumber
button.ImageEdgeInsets = new UIEdgeInsets(0, -leftPadding, 0, leftPadding); button.ContentEdgeInsets = new UIEdgeInsets(0, 0, 0, leftPadding);
. Itu di Xamarin, tetapi harus menerjemahkan ke Swift / Obj-C dengan cukup mudah.Ada cara yang lebih mudah dari Interface Builder .
Pilih UIButton dan pilih opsi ini di View Utilities> Semantic :
Itu dia! Bagus dan sederhana!
Jika Anda ingin menyesuaikan jarak antara gambar dan judul, Anda dapat mengubah Image Inset di sini:
Semoga itu bisa membantu!
sumber
Subclassing UIButton sama sekali tidak perlu. Alih-alih, Anda cukup menetapkan nilai inset kiri tinggi untuk inset gambar, dan inset kanan kecil untuk judul. Sesuatu seperti ini:
sumber
Saya memberi Inspire48 penghargaan untuk yang satu ini. Berdasarkan sarannya dan melihat pertanyaan lain itu saya menemukan ini. Subclass UIButton dan timpa metode ini.
sumber
buttonWithType
If you subclass UIButton, this method does not return an instance of your subclass. If you want to create an instance of a specific subclass, you must alloc/init the button directly
danbackgroundRectForBounds
Subclasses yang memberikan perhiasan latar belakang kustom dapat menggantikan metode ini dan mengembalikan persegi batas yang dimodifikasi untuk mencegah tombol dari menggambar konten kustom apa pun. `Tidak ada yang menyebutkan spesifik metode, tapi saya berasumsi mereka tidak keberatan subclass.frame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(frame) - self.imageEdgeInsets.right + self.imageEdgeInsets.left - frame.origin.x;
Ini bekerja lebih baik untukUIControlContentHorizontalAlignmentCenter
dan lain-lain ...Perbarui saja insets ketika judul diubah. Anda perlu mengkompensasi inset dengan inset yang sama dan berlawanan di sisi lain.
sumber
[thebutton.titleLabel sizeToFit];
sebelumnya. Lebar mungkin nol jika Anda belum memicu tata letak. Hal yang sama berlaku untuk ukuran gambar (cukup gunakan ukuran UIImage.size daripada ukuran imageView)titleWidth = [self.titleLabel sizeThatFits:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height)].width;
(atau jika Anda khawatir tentang bingkai tombol yang belum dibuat, gunakan CGFLOAT_MAX untuk ketinggian juga) danimageWidth = self.currentImage.size.width;
layoutSubviews
dalamUITableViewCell
subkelas saya tetapi ini bekerja dengan baik. Terima kasih!Semua jawaban ini, per Januari 2016, tidak perlu. Di Interface Builder, atur Tampilan Semantic ke
Force Right-to-Left
, atau jika Anda lebih suka cara terprogram,semanticContentAttribute = .forceRightToLeft
Itu akan menyebabkan gambar muncul di sebelah kanan teks Anda.sumber
UIBarButtonItem(customView: button)
, tetapi akan bekerja jika Anda membungkus tombol di dalam beberapa tampilan kosongDalam pembangun antarmuka, Anda dapat mengonfigurasi opsi Edge Insets untuk UIButton, secara terpisah masing-masing dari tiga bagian: konten, gambar, judul
Xcode 8:
sumber
Pembaruan: Swift 3
Jawaban asli untuk Swift 2:
Sebuah solusi yang menangani semua perataan horizontal, dengan contoh implementasi Swift. Cukup terjemahkan ke Objective-C jika perlu.
Juga perlu dicatat bahwa ia menangani insets gambar & judul dengan cukup baik.
Terinspirasi dari jawaban jasongregori;)
sumber
@IBDesignable
kelas dan melihatnya terbalik pada waktu desain.Jika ini perlu dilakukan di UIBarButtonItem , pembungkus tambahan harus digunakan.
Ini akan berfungsi
Ini tidak akan berhasil
sumber
Inilah solusi untuk
UIButton
dengan konten yang selaras dengan pusat. Kode ini membuat gambar disejajarkan dengan benar dan memungkinkan untuk digunakanimageEdgeInsets
dantitleEdgeInsets
untuk penentuan posisi yang berharga.Subkelas
UIButton
dengan kelas khusus Anda dan tambahkan:sumber
Karena solusi transformasi tidak berfungsi di iOS 11, saya memutuskan untuk menulis pendekatan baru.
Menyesuaikan tombol
semanticContentAttribute
memberi kita gambar dengan baik ke kanan tanpa harus menyampaikan jika teks berubah. Karena inilah solusi ideal. Namun saya masih membutuhkan dukungan RTL. Fakta bahwa suatu aplikasi tidak dapat mengubah arah tata letak dalam sesi yang sama menyelesaikan masalah ini dengan mudah.Dengan itu, itu cukup lurus ke depan.
sumber
Ekstensi jalan
Menggunakan ekstensi untuk mengatur gambar di sisi kanan dengan offset khusus
sumber
Swift -Tambah UiButton dan masukkan baris-baris ini
sumber
Membangun solusi elegan Piotr Tomasik: jika Anda ingin memiliki sedikit jarak antara label tombol dan gambar juga, maka sertakan dalam insets tepi Anda sebagai berikut (menyalin kode saya di sini yang berfungsi dengan baik untuk saya):
Terima kasih Piotr untuk solusi Anda!
Erik
sumber
Lakukan sendiri. Xcode10, swift4,
Untuk desain UI terprogram
untuk desain StoryBoard UI
sumber
Tata letak subclassing dan over-ridingSubviews mungkin merupakan cara terbaik Anda.
Dirujuk dari: UIButton iPhone - posisi gambar
sumber
Mengambil jawaban @ Piotr dan membuatnya menjadi ekstensi Swift. Pastikan untuk mengatur gambar dan judul sebelum memanggil ini, sehingga ukuran tombol dengan benar.
}
sumber
Opsi cepat yang melakukan apa yang Anda inginkan tanpa bermain dengan inset apa pun:
sumber
Solusi yang disebutkan di sini berhenti berfungsi, setelah saya mengaktifkan Tata Letak Otomatis . Saya harus membuat sendiri:
Subclass UIButton dan
layoutSubviews
metode override :Hasil:
sumber
Swift 3.0 Migration solution diberikan oleh jasongregori
sumber
Saya memutuskan untuk tidak menggunakan tampilan gambar tombol standar karena solusi yang diusulkan untuk memindahkannya terasa dirusak. Ini memberi saya estetika yang diinginkan, dan intuitif untuk memposisikan ulang tombol dengan mengubah batasan:
sumber
Swift 3:
sumber
Bagaimana dengan Kendala? Tidak seperti semanticContentAttribute, mereka tidak mengubah semantik. Sesuatu seperti ini mungkin:
atau di Objective-C:
Peringatan: Belum teruji, iOS 9+
sumber
Untuk meluruskan gambar di dalam UIButton coba kode di bawah ini
sumber
Setelah mencoba beberapa solusi dari seluruh internet, saya tidak mencapai persyaratan yang tepat. Jadi saya akhirnya menulis kode utilitas khusus. Posting untuk membantu seseorang di masa depan. Diuji pada swift 4.2
sumber
untuk masalah ini Anda dapat membuat UIView di dalam "label with UIImage view" dan mengatur kelas UIView sebagai UIControl dan membuat IBAction sebagai tuch up in side
sumber
Swift 4 & 5
Ubah arah gambar UIButton (RTL dan LTR)
sumber
Utility
?Xcode 11.4 Swift 5.2
Bagi siapa pun yang ingin meniru gaya tombol Kembali dengan chevron seperti ini:
Penerapan:
sumber
Saya akhirnya membuat tombol kustom, yang memungkinkan pengaturan Gambar dari Inspektur. Di bawah ini adalah kode saya:
Anda dapat menyesuaikan nilai Gap Padding dari Inspector untuk menyesuaikan jarak antara teks dan gambar.
PS: Menggunakan sebagian kode dari jawaban @ Mark Hennings
sumber