Bir UIButton'un imageSize'ı nasıl ayarlanır?


158

UIButton'un görüntü boyutunu nasıl ayarlayabilirim? Görüntüyü şu şekilde ayarlıyorum:

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

Ancak bu, görüntüyü tam düğmeye kadar doldurur, görüntüyü nasıl küçültebilirim?


6
Görüntüyü küçültmeyi denediniz mi (LOL)?
CodaFi

1
@CodaFi haklı, genellikle CPU için herhangi bir işi azalttığı, daha az bellek kullandığı ve muhtemelen herhangi bir ölçekleme artefaktı
sunmadığınız için

Ayrıca düğmeyi görüntünün boyutuna (veya tam tersi) yapabilirsiniz.Neden büyük bir düğmeniz var ... içinde küçük bir resim var.İstediğiniz görüntüyü ekleyin, özel düğmeler için budur veya yapabilirsiniz başkalarının açık bir fikre sahip olması için uygulamak istediğiniz mantığı açıklayın.
Abhishek Singh

Yanıtlar:


243

Ne yapmaya çalıştığınızı doğru bir şekilde anlarsam, görüntü kenarı eki düğmeleriyle oynamanız gerekir. Gibi bir şey:

myLikesButton.imageEdgeInsets = UIEdgeInsets(top, left, bottom, right)

96

Tim'in cevabı doğrudur, ancak başka bir öneri eklemek istedim, çünkü benim durumumda tamamen daha basit bir çözüm vardı.

UIButtonGörüntü eklerini ayarlamak istiyordum çünkü düğmenin içerik modunu ayarlayabileceğimi fark etmedim UIImageView, bu da UIEdgeInsets ve sabit kodlanmış değerleri tamamen kullanma ihtiyacını önleyecekti. Düğmedeki temel görüntü görünümüne erişin ve içerik modunu ayarlayın:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

Bkz. UIButton içerik modu ayarını dinlemiyor mu?

Hızlı 3

myButton.imageView?.contentMode = .scaleAspectFit

1
backgroundImage için aynı nasıl yapılır?
Sergey Sahakyan

myButton.backgroundImageView? .contentMode = .scaleAspectFit
Andrea.Ferrando

@ Andrea.Ferrando button.backgroundImageView.contentModeçalışmıyor
Seong Lee

Kendinize biraz zaman kazandırın ve arka plan görüntüsü değil görüntüyü ayarladığınızdan emin olun! @SeongLee, backgroundMode veya EdgeInserts ile arka plan resmini değiştiremezsiniz
redPanda

42

Hızlı 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

6
Bu benim için güzel çalıştı. Inkscape içinde bir PDF simgesi oluşturdum ve contentVerticalAlignment/contentHorizontalAlignmentseçenekler umduğum şekilde ölçeklememi sağladı. Bunu gönderdiğiniz için teşekkür ederiz.
Adrian

2
ayarı contentHorizontalAlignmentve contentVerticalAlignmenthile vermedi
Tom Knapen

1
Bu çözüm, simgeler için PDF öğelerini kullanırken harika çalışır. Teşekkür ederim!
Eneko Alonso

39

Bunu, bunun gibi inteface oluşturucudan da yapabilirsiniz.

resim açıklamasını buraya girin

Bence faydalı.


26

Resminiz çok büyükse (ve görüntüyü daha küçük yapmak istemiyorsanız / istemiyorsanız), ilk iki yanıtın bir kombinasyonu harika çalışır.

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

Görüntü iç metinlerini tam olarak almazsanız, görüntü değiştirilmeden eğriltilir contentMode.


23

imageEdgeInsetsdüğmesinin görüntüsünün etrafındaki dikdörtgen için iç metin veya başlangıç ​​kenar boşlukları özelliğini kullanabilirsiniz .

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

Pozitif bir değer o kenarı küçültür veya ekler — hareket eder. Negatif bir değer bu kenarı genişletir veya öteler.


17

UIButton'un imageView değerini ölçeklendirmek için başka bir çözüm.

button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)

Günümü kurtardın. Sadece bir düğmenin içindeki resmimi ölçeklendirmek istedim. Ek yok, hiçbir şey yok, teşekkürler!
Pedro Antonio

15

Heres Swift sürümü:

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

8

Hızlı 4

Bu iki kod satırını, bu özel sırayla kullanmanız gerekir. Tek ihtiyacınız olan kenar iç metinlerinin üst ve alt değerlerini değiştirmek.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)

Bunlar EXC_BAD_ACCESSçağrıldığında bir hataya neden oldu override func layoutSubviews().
Andrew Kirna

7

Yardımıyla Tim C'nin cevap , ben bir uzantısı oluşturmak başardı UIButtonEğer kullanarak resim çerçevesi belirlemenizi sağlar Swift kullanarak .setImage()fazladan ile işlev frameparametresi

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
            )
        }
    }

}

Bir n çerçevesi istiyorsa, bu kullanma UIButtoniçin CGRectMake(0, 0, 64, 64), ve bunun görüntüsünü ayarlamak myImagebir çerçeve ile CGRectMake(8, 8, 48, 48)size kullanabilirsiniz,

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
    myImage,
    inFrame: CGRectMake(8, 8, 48, 48),
    forState: UIControlState.Normal
)

4
Sen olmalıdır if letyerine, denetimi frameolduğunu nilo zaman ve milyonlarca kez unwrapping zorlamak .
fpg1503

7

İle simge boyutunu değiştirirken UIEdgeInsetsMake(top, left, bottom, right) , düğme boyutlarını ve UIEdgeInsetsMM'in negatif gibi pozitif değerlerle çalışmayı unutmayın.

Örnek: Yükseklik 100 ve en boy oranı 1: 1 olan iki düğme.

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

Örnek 1 ve 3, ABS (100 - (40 + 40)) = ABS (100 - (60 + 60)) olduğu için aynıdır.


2

Hızlı 3

MyButton genişliğini ve yüksekliğini 40 olarak ayarladım ve EdgeInsetsMake'den doldurmamın her tarafı 15. Gerçek dolguyu görmek için düğmenize bir arka plan rengi eklemenizi öneririm.

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

2

Bir yaklaşım UIImage kodunu aşağıdaki gibi yeniden boyutlandırmaktır. Not: Bu kod yalnızca yüksekliğe göre ölçeklenir, ancak işlevi genişliğe göre ölçeklemek için de kolayca ayarlayabilirsiniz.

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!
}

2

Swift> 5 için güncellendi

boyutunu ayarlamak:

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

kenar boşluklarını ayarla:

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

1

Swift 3 için güncellendi

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

-6

Bence, görüntü boyutu da düğme boyutu ile aynı o zaman düğmenin arka planına görüntü koymak gibi:

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

direk aynı görüntü ve düğme boyutuna sahip. umarım anladım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.