Erstellen Sie programmgesteuert eine Schaltfläche und legen Sie ein Hintergrundbild fest


75

Wenn ich versuche, eine Schaltfläche zu erstellen und ein Hintergrundbild in Swift festzulegen:

let button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
    button.frame = CGRectMake(100, 100, 100, 100)
    button.setImage(IMAGE, forState: UIControlState.Normal)
    button.addTarget(self, action: "btnTouched:", forControlEvents: UIControlEvents.TouchUpInside)

    self.view.addSubview(button)

Ich erhalte immer eine Fehlermeldung: " Der Ausdruckstyp 'Void' kann nicht in den Typ 'UIImage' konvertiert werden. "


Können Sie den Code anzeigen, in dem Sie deklarieren IMAGE?
67cherries

2
Wie erstellen Sie das Bild? Möglicherweise muss es IMAGE auspacken!
Alex Reynolds

1
IMAGEsollte aussehen wieUIImage(named: "name")
Daniel

Danke das funktioniert! Ich sagte nur: "button.setImage (" CircleTap ", forState: UIControlState.Normal)", aber jetzt funktioniert es perfekt
Gary

Antworten:


139

Ihr Code sollte wie folgt aussehen

let image = UIImage(named: "name") as UIImage?
let button   = UIButton(type: UIButtonType.Custom) as UIButton
button.frame = CGRectMake(100, 100, 100, 100)
button.setImage(image, forState: .Normal)
button.addTarget(self, action: "btnTouched:", forControlEvents:.TouchUpInside)
self.view.addSubview(button)

2
Ich denke, es sollte eigentlich sein. as? UIImage Ihre Version wird abstürzen, wenn imageNamed:null zurückgegeben wird.
David Berry

3
Nun, das ist deine Schuld, wenn es gleich Null ist, aber du kannst das hinzufügen? aber dann müssen Sie sich auch dessen bewusst sein, wenn setImage. Ich denke, es hängt davon ab, wie defensiv Sie werden möchten, und da Sie das lokale Vermögen kontrollieren, sollte es keine Überraschung mit ein oder zwei Unit-Tests geben
Alex Reynolds

1
Was ist mit Kreisbildern?
Benutzer

Versuchen Sie, das? as UIImage?
Alex Reynolds

4
Ändern Sie den Schaltflächentyp in Benutzerdefiniert, wenn Sie keine blaue Schaltfläche sehen möchten. button = UIButton.buttonWithType (UIButtonType.Custom) als UIButton
iluvatar_GR

26

Versuchen Sie es unten:

let image = UIImage(named: "ImageName.png") as UIImage
var button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
button.frame = CGRectMake(100, 100, 100, 100)
button .setBackgroundImage(image, forState: UIControlState.Normal)
button.addTarget(self, action: "Action:", forControlEvents:UIControlEvents.TouchUpInside)
menuView.addSubview(button)

Lassen Sie mich wissen, ob es funktioniert oder nicht?


Sie sollten buttonWithType auf UIButtonType.Custom setzen, nicht auf System, bis das Bild zeigt
sazz

9

SWIFT 3 Version von Alex Reynolds 'Antwort

let image = UIImage(named: "name") as UIImage?
let button = UIButton(type: UIButtonType.custom) as UIButton
button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
button.setImage(image, for: .normal)
button.addTarget(self, action: Selector("btnTouched:"), for:.touchUpInside)
        self.view.addSubview(button)

7

Swift 5- Version der akzeptierten Antwort:

let image = UIImage(named: "image_name")
let button = UIButton(type: UIButton.ButtonType.custom)
button.frame = CGRect(x: 100, y: 100, width: 200, height: 100)
button.setImage(image, for: .normal)
button.addTarget(self, action: #selector(function), for: .touchUpInside)

//button.backgroundColor = .lightGray
self.view.addSubview(button)

wo natürlich

@objc func function() {...}

Das Bild ist standardmäßig zur Mitte ausgerichtet. Sie können dies ändern, indem Sie die imageEdgeInsets der Schaltfläche wie folgt einstellen:

// In this case image is 40 wide and aligned to the left
button.imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: button.frame.width - 45)

6

Sie müssen überprüfen, ob das Bild nicht Null ist, bevor Sie es der Schaltfläche zuweisen.

Beispiel:

let button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
button.frame = CGRectMake(100, 100, 100, 100)
if let image  = UIImage(named: "imagename.png") {
    button.setImage(image, forState: .Normal)
}

button.addTarget(self, action: "btnTouched:", forControlEvents:.TouchUpInside)
self.view.addSubview(button)

Ich würde denken, ich möchte, dass die App abstürzt, wenn das Bild nicht im Projekt ist. Warum also nachsehen?
Jeff

Weil dann die App nicht abstürzen würde und mit einem fehlenden Bild geliefert werden könnte
MacInnis

6

Schaltfläche "Erstellen" und Bild als Hintergrund hinzufügen schnell 4

     let img = UIImage(named: "imgname")
     let myButton = UIButton(type: UIButtonType.custom)
     myButton.frame = CGRect.init(x: 10, y: 10, width: 100, height: 45)
     myButton.setImage(img, for: .normal)
     myButton.addTarget(self, action: #selector(self.buttonClicked(_:)), for: UIControlEvents.touchUpInside)
     self.view.addSubview(myButton)

Korrektur: Zeile 4] button.setImage (Bild, für: .normal)
MacInnis

4
let btnRight=UIButton.buttonWithType(UIButtonType.Custom) as UIButton
btnRight.frame=CGRectMake(0, 0, 35, 35)
btnRight.setBackgroundImage(UIImage(named: "menu.png"), forState: UIControlState.Normal)
btnRight.setTitle("Right", forState: UIControlState.Normal)
btnRight.tintColor=UIColor.blackColor()

4

So können Sie einen schönen Knopf mit einer Lünette und abgerundeten Kanten erstellen:

loginButton = UIButton(frame: CGRectMake(self.view.bounds.origin.x + (self.view.bounds.width * 0.325), self.view.bounds.origin.y + (self.view.bounds.height * 0.8), self.view.bounds.origin.x + (self.view.bounds.width * 0.35), self.view.bounds.origin.y + (self.view.bounds.height * 0.05)))
loginButton.layer.cornerRadius = 18.0
loginButton.layer.borderWidth = 2.0
loginButton.backgroundColor = UIColor.whiteColor()
loginButton.layer.borderColor = UIColor.whiteColor().CGColor
loginButton.setTitle("Login", forState: UIControlState.Normal)
loginButton.setTitleColor(UIColor(red: 24.0/100, green: 116.0/255, blue: 205.0/205, alpha: 1.0), forState: UIControlState.Normal)

3

Um den Hintergrund festzulegen, können wir ihn nicht mehr verwenden forState. Daher müssen wir Folgendes forfestlegen UIControlState:

let zoomInImage = UIImage(named: "Icon - plus") as UIImage?
let zoomInButton = UIButton(frame: CGRect(x: 10), y: 10, width: 45, height: 45))
zoomInButton.setBackgroundImage(zoomInImage, for: UIControlState.normal)
zoomInButton.addTarget(self, action: #selector(self.mapZoomInAction), for: .touchUpInside)
self.view.addSubview(zoomInButton)

Ich benutze diesen Code, um die Zoom-Schaltfläche auf Google Map zu setzen. Verwenden Sie den obigen Code, um das Hintergrundbild festzulegen. Es ist nicht dasselbe wie früher.
Shazoo

Wie unterscheidet es sich von den anderen Antworten?
Leopold Joy

Um den Hintergrund jetzt festzulegen, können wir forState nicht verwenden. Jetzt müssen wir "for" verwenden, um den UIControlState
Shazoo

2

Update auf Swift 3

let image = UIImage(named: "name")
let button = UIButton(type: .custom)
button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
button.setImage(image, for: .normal)
button.addTarget(self, action: #selector(self.btnAbsRetClicked(_:)), for:.touchUpInside)
self.view.addSubview(button)

1

Swift: Ui Button programmgesteuert erstellen

let myButton = UIButton()

myButton.titleLabel!.frame = CGRectMake(15, 54, 300, 500)

myButton.titleLabel!.text = "Button Label"

myButton.titleLabel!.textColor = UIColor.redColor()

myButton.titleLabel!.textAlignment = .Center

myButton.addTarget(self,action:"Action:",forControlEvents:UIControlEvent.TouchUpInside)

self.view.addSubview(myButton)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.