2012-05-14 14 views
89

Wie kann ich die Bildgröße des UIButton anpassen? Ich stelle das Bild wie folgt aus:Wie wird die imageSize eines UIButton angepasst?

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

jedoch diese das Bild auf die volle Taste füllt, wie mache ich das Bild kleiner?

+5

Haben Sie versucht, das Bild kleiner (LOL) zu machen? – CodaFi

+1

@CodaFi hat Recht, Sie sollten im Allgemeinen Vermögenswerte in der richtigen Größe zur Verfügung stellen, da es jede Arbeit für die CPU reduziert, weniger Speicher verbraucht und höchstwahrscheinlich besser aussieht, da Sie möglicherweise keine Skalierungsartefakte einführen ... –

+0

Auch Sie können machen der Knopf zur Größe des Bildes (oder umgekehrt). Warum haben Sie einen großen Knopf ... mit einem kleinen Bild darin. Fügen Sie einfach das Bild hinzu, das Sie wünschen, das ist, was kundenspezifische Knöpfe sind, oder Sie können die Logik erklären, die Sie möchte für andere eine klare Idee umsetzen. –

Antwort

150

Wenn ich richtig verstehe, was Sie zu tun versuchen, müssen Sie mit den Schaltflächen Bildrand einfügen spielen. Etwas wie:

myLikesButton.imageEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right); 
-6

Ich denke, Ihre Bildgröße ist auch gleich wie Knopfgröße dann Sie Bild im Hintergrund der Schaltfläche setzen wie:

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

Sie Mast haben die gleiche Größe des Bildes und Taste. Ich hoffe du verstehst meinen Standpunkt.

16

können Sie imageEdgeInsets Eigenschaft verwenden Die Einfüge- oder Anfangsränder für das Rechteck um das Bild der Schaltfläche.

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

Ein positiver Wert schrumpft oder kippt diesen Rand um. Ein negativer Wert erweitert oder outsettiert diese Kante.

63

Tims Antwort ist korrekt, aber ich wollte einen weiteren Vorschlag hinzufügen, denn in meinem Fall gab es insgesamt eine einfachere Lösung.

Ich wollte die UIButton Bildeinfügungen setzen, weil ich nicht erkannte, dass ich den Inhaltsmodus auf UIImageView der Schaltfläche festlegen konnte, die die Notwendigkeit verhindert hätte, UIEdgeInsets und fest codierte Werte insgesamt zu verwenden. Zugriff einfach die zugrunde liegende Imageview auf die Schaltfläche und stellen Sie den Inhalt Modus:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit; 

UIButton doesn't listen to content mode setting?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit 
+1

Wie mache ich dasselbe für backgroundImage? –

+0

myButton.backgroundImageView? .contentMode = .scaleAspectFit –

+0

@ Andrea.Ferrando 'button.backgroundImageView.contentMode' funktioniert nicht –

11

Heres die Swift-Version Siehe:

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

Mit Hilfe von Tim C's answer, konnte ich eine Erweiterung auf UIButton mit Swift erstellen, die Sie mit der .setImage() Funktion mit einem zusätzlichen frame Parameter

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

} 

Mit diesem den Bildrahmen festlegen können, wenn Sie den Rahmen ein setzen wollten UIButton-CGRectMake(0, 0, 64, 64), und stellen Sie das Bild um es zu myImage mit einem Rahmen von CGRectMake(8, 8, 48, 48), könnten Sie

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

Sie sollten' if let' anstatt zu überprüfen, ob 'frame'' nil' ist und dann [force auspacken a Millionen Mal] (https://i.imgflip.com/utfq7.jpg). – fpg1503

10

Sie können tun, wie diese verwenden auch, dass von inteface Builder.

enter image description here

Ich denke, es hilfreich ist.

7

Wenn Ihr Bild zu groß ist (und Sie das Bild nicht verkleinern können/wollen), funktioniert eine Kombination der ersten beiden Antworten sehr gut.

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

Sofern Sie die Bild Einsätze gerade richtig, wird das Bild ohne die contentMode Wechsel verzerrt werden.

5

Swift 3:

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

aktualisiert Swift 3

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

Swift 3

eingestellt I myButton Breite und Höhe bis 40 und meine Polsterung aus EdgeInsetsMake 15 alle Seiten . Ich schlage vor, eine Hintergrundfarbe zu Ihrem Knopf hinzuzufügen, um das tatsächliche Auffüllen zu sehen.

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