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. "

Gary
quelle
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)
Alex Reynolds
quelle
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?

kiran
quelle
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)
Oscar
quelle
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)
Tiefes Blau
quelle
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)
Toseef Khilji
quelle
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)
ViJay Avhad
quelle
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()
Mak
quelle
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)
Codetard
quelle
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)
Shazoo
quelle
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)
Nikhil Manapure
quelle
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)
Shanmugasundharam
quelle