Bagaimana cara menyesuaikan imageSize UIButton?

158

Bagaimana saya bisa menyesuaikan ukuran gambar UIButton? Saya mengatur gambar seperti ini:

[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

Namun ini mengisi gambar ke tombol penuh, bagaimana cara membuat gambar lebih kecil?

adit
sumber
6
Sudahkah Anda mencoba membuat gambar lebih kecil (LOL)?
CodaFi
1
@CodaFi benar, Anda biasanya harus menyediakan aset pada ukuran yang tepat karena mengurangi pekerjaan untuk CPU, menggunakan lebih sedikit memori dan kemungkinan besar akan terlihat lebih baik karena Anda tidak berpotensi memperkenalkan artefak penskalaan ...
Paul.s
Anda juga dapat membuat tombol dengan ukuran gambar (atau sebaliknya). Mengapa memiliki tombol besar ... dengan gambar kecil di dalamnya. Cukup tambahkan gambar yang Anda inginkan, itulah gunanya tombol kustom untuk atau Anda bisa jelaskan logika yang ingin Anda terapkan agar orang lain memiliki gagasan yang jelas.
Abhishek Singh

Jawaban:

243

Jika saya mengerti benar apa yang Anda coba lakukan, Anda perlu bermain dengan inset tepi gambar tombol. Sesuatu seperti:

myLikesButton.imageEdgeInsets = UIEdgeInsets(top, left, bottom, right)
Tim C
sumber
96

Jawaban Tim sudah benar, namun saya ingin menambahkan saran lain, karena dalam kasus saya ada solusi yang lebih sederhana.

Saya mencari untuk mengatur UIButtoninsets gambar karena saya tidak menyadari bahwa saya dapat mengatur mode konten pada tombol UIImageView, yang akan mencegah perlunya menggunakan UIEdgeInsets dan nilai-nilai hard-coded secara bersamaan. Cukup akses tampilan gambar di bawah tombol dan atur mode konten:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

Lihat UIButton tidak mendengarkan pengaturan mode konten?

Cepat 3

myButton.imageView?.contentMode = .scaleAspectFit
Kyle Clegg
sumber
1
bagaimana melakukan hal yang sama untuk backgroundImage?
Sergey Sahakyan
myButton.backgroundImageView? .contentMode = .scaleAspectFit
Andrea.Ferrando
@ Andrea.Ferrando button.backgroundImageView.contentModetidak berfungsi
Seong Lee
Hemat waktu Anda dan pastikan Anda mengatur gambar bukan gambar latar belakang! @SeongLee benar Anda tidak dapat memanipulasi gambar latar belakang dengan contentMode atau EdgeInserts
redPanda
42

Swift 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
Josh O'Connor
sumber
6
Ini bekerja dengan baik untuk saya. Saya membuat ikon PDF di dalam Inkscape dan contentVerticalAlignment/contentHorizontalAlignmentopsi - opsi yang ada memungkinkan saya untuk mengukurnya sesuai dengan yang saya harapkan. Terima kasih telah memposting ini.
Adrian
2
pengaturan contentHorizontalAlignmentdan contentVerticalAlignmentmelakukan trik
Tom Knapen
1
Solusi ini berfungsi dengan baik ketika menggunakan aset PDF untuk ikon. Terima kasih!
Eneko Alonso
38

Anda juga dapat melakukannya dari pembangun inteface seperti ini.

masukkan deskripsi gambar di sini

Saya pikir ini membantu.

Milos Mandic
sumber
26

Jika gambar Anda terlalu besar (dan Anda tidak bisa / tidak ingin hanya membuat gambar lebih kecil), kombinasi dari dua jawaban pertama berfungsi dengan baik.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)

Kecuali jika Anda mendapatkan inset gambar dengan benar, gambar akan miring tanpa mengubah contentMode.

iosjillian
sumber
23

Anda dapat menggunakan imageEdgeInsetsproperti margin inset atau outset untuk persegi panjang di sekitar gambar tombol.

 [self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];

Nilai positif menyusut, atau insets, ujung itu — bergerak. Nilai negatif memperluas, atau mengimbangi, tepi itu.

safaa elgendi
sumber
17

Berikut ini solusi lain untuk skala imageView dari UIButton.

button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)
ovo
sumber
Kamu menyelamatkan hariku. Saya hanya ingin skala gambar saya di dalam tombol. Tidak ada insets tidak apa-apa, terima kasih!
Pedro Antonio
15

Inilah versi Swift:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
Esqarrouth
sumber
8

Cepat 4

Anda perlu menggunakan dua baris kode ini, dalam urutan khusus ini. Yang Anda butuhkan hanyalah mengubah nilai atas dan bawah dari insets tepi.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
Van Du Tran
sumber
Ini menyebabkan EXC_BAD_ACCESSkesalahan saat dipanggil dari override func layoutSubviews().
Andrew Kirna
7

Dengan bantuan jawaban Tim C , saya dapat membuat ekstensi UIButtonmenggunakan Swift yang memungkinkan Anda menentukan bingkai gambar dengan menggunakan .setImage()fungsi dengan frameparameter tambahan

extension UIButton{

    func setImage(image: UIImage?, inFrame frame: CGRect?, forState state: UIControlState){
        self.setImage(image, forState: state)

        if let frame = frame{
            self.imageEdgeInsets = UIEdgeInsets(
                top: frame.minY - self.frame.minY,
                left: frame.minX - self.frame.minX,
                bottom: self.frame.maxY - frame.maxY,
                right: self.frame.maxX - frame.maxX
            )
        }
    }

}

Menggunakan ini, jika Anda ingin mengatur bingkai a UIButton untuk CGRectMake(0, 0, 64, 64), dan mengatur gambar itu myImagedengan bingkai CGRectMake(8, 8, 48, 48), Anda bisa menggunakan

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
    myImage,
    inFrame: CGRectMake(8, 8, 48, 48),
    forState: UIControlState.Normal
)
Jojodmo
sumber
4
Anda harus if letbukannya memeriksa apakah framesudah nildan kemudian memaksa membuka bungkus miliaran kali .
fpg1503
7

Saat mengubah ukuran ikon dengan UIEdgeInsetsMake(top, left, bottom, right) , perlu diingat dimensi tombol dan kemampuan UIEdgeInsetsMake untuk bekerja dengan nilai negatif seolah-olah mereka positif.

Contoh: Dua tombol dengan tinggi 100 dan aspek 1: 1.

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)

masukkan deskripsi gambar di sini

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)

masukkan deskripsi gambar di sini

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)

masukkan deskripsi gambar di sini

Contoh 1 dan 3 identik sejak ABS (100 - (40 + 40)) = ABS (100 - (60 + 60))

Borys T
sumber
2

Cepat 3

Saya mengatur lebar dan tinggi myButton ke 40 dan bantalan saya dari EdgeInsetsMake adalah 15 semua sisi. Saya sarankan untuk menambahkan warna latar belakang ke tombol Anda untuk melihat padding yang sebenarnya.

myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)
Sarang tupai
sumber
2

Salah satu pendekatan adalah mengubah ukuran UIImage dalam kode seperti berikut. Catatan: kode ini hanya berskala berdasarkan tinggi, tetapi Anda dapat dengan mudah menyesuaikan fungsi dengan skala berdasarkan lebar juga.

let targetHeight = CGFloat(28)
let newImage = resizeImage(image: UIImage(named: "Image.png")!, targetHeight: targetHeight)
button.setImage(newImage, for: .normal)

fileprivate func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage {
    // Get current image size
    let size = image.size

    // Compute scaled, new size
    let heightRatio = targetHeight / size.height
    let newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    // Create new image
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    // Return new image
    return newImage!
}
Crashalot
sumber
2

Diperbarui untuk Swift> 5

atur ukuran:

button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)

atur margin:

button.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
skantus
sumber
1

Diperbarui untuk Swift 3

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
iAj
sumber
-6

saya pikir, ukuran gambar Anda juga sama dengan ukuran tombol maka Anda menempatkan gambar di latar belakang tombol seperti:

[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

Anda mast memiliki ukuran gambar dan tombol yang sama. Saya harap Anda mengerti maksud saya.

Dev
sumber