Impostazione di un'immagine per un pulsante UIB nel codice


197

Come si imposta l'immagine per un UIButton nel codice?

Ho questo:

UIButton *btnTwo = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
btnTwo.frame = CGRectMake(40, 140, 240, 30);
[btnTwo setTitle:@"vc2:v1" forState:UIControlStateNormal];
[btnTwo addTarget:self action:@selector(goToOne) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnTwo];

ma non vedo che cosa imposta l'immagine per esso.

Risposte:


400

Objective-C

UIImage *btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setImage:btnImage forState:UIControlStateNormal];

Swift 5.1

let btnImage = UIImage(named: "image")
btnTwo.setImage(btnImage , for: .normal)

1
Come sidenote: questo mostrerà l'immagine, ma il testo del titolo del pulsante verrà nascosto.
— leviatano,

Questo codice funziona perfettamente ma sto ottenendo un'immagine con l'analisi, quindi come posso farlo poiché questo codice funziona per me nel caso UIImage: - largePick.image = aNewsInfo.smallImageData; come posso farlo con UIButton ... Puoi aiutarmi ...
— user755278

1
@slcott, dove lo indica la documentazione ? Non lo vedo suggerire da nessuna parte che setImageè deprecato. (Mi sembra che stai confondendo UIButton.setImagecon UITableViewCell.image, che è una proprietà deprecata come avete dichiarato.)
— Kirk Woll

12
Attenzione: se usi qualcosa di diverso da UIButtonTypeCustom, l'immagine sarà blu in iOS7 e 8.
— Apfelsaft

2
Per Swift 3: btnTwo.setImage (btnImage, per: UIControlState.normal)
— Micah Montoya

57

La soluzione di Mike mostrerà semplicemente l'immagine, ma qualsiasi titolo impostato sul pulsante non sarà visibile, perché puoi impostare il titolo o l'immagine.

Se vuoi impostare entrambi (la tua immagine e il tuo titolo) usa il seguente codice:

btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setBackgroundImage:btnImage forState:UIControlStateNormal];
[btnTwo setTitle:@"Title" forState:UIControlStateNormal];

2
qual è la differenza tra setImage e setBackgroundImage ?
— onmyway133

3
setBackgroundImage allungherà l'immagine della larghezza del pulsante sul testo del titolo mentre setImage renderà il pulsante un'immagine ignorando il testo del titolo senza allungare l'immagine.
— Ernest,

21

Prima che funzionasse per me, ho dovuto ridimensionare la cornice del pulsante in modo esplicito in base alle dimensioni della cornice dell'immagine.

UIImage *listImage = [UIImage imageNamed:@"list_icon.png"];
UIButton *listButton = [UIButton buttonWithType:UIButtonTypeCustom];

// get the image size and apply it to the button frame
CGRect listButtonFrame = listButton.frame;
listButtonFrame.size = listImage.size;
listButton.frame = listButtonFrame;

[listButton setImage:listImage forState:UIControlStateNormal];
[listButton addTarget:self.navigationController.parentViewController 
               action:@selector(revealToggle:) 
     forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *jobsButton = 
  [[UIBarButtonItem alloc] initWithCustomView:listButton];

self.navigationItem.leftBarButtonItem = jobsButton;

@jrasmusson volevo solo aggiungere che le 3 righe di giocherellare con la cornice possono anche essere scritte in[listButton sizeToFit]
— bk138

10

Nel caso di Swift User

// case of normal image
let image1 = UIImage(named: "your_image_file_name_without_extension")!
button1.setImage(image1, forState: UIControlState.Normal) 

// in case you don't want image to change when "clicked", you can leave code below
// case of when button is clicked
let image2 = UIImage(named: "image_clicked")!
button1.setImage(image2, forState: UIControlState.Highlight) 

9

Puoi farlo in questo modo

[btnTwo setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];

9
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 150, 44);
[btn setBackgroundImage:[UIImage imageNamed:@"buttonimage.png"] 
               forState:UIControlStateNormal];
[btn addTarget:self 
     action:@selector(btnSendComment_pressed:) 
     forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];

8

Puoi mettere l'immagine in entrambi i modi:

UIButton *btnTwo = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
btnTwo.frame = CGRectMake(40, 140, 240, 30);
[btnTwo setTitle:@"vc2:v1" forState:UIControlStateNormal];
[btnTwo addTarget:self 
           action:@selector(goToOne) 
 forControlEvents:UIControlEventTouchUpInside];


[btnTwo setImage:[UIImage imageNamed:@"name.png"] forState:UIControlStateNormal];

//OR setting as background image

[btnTwo setBackgroundImage:[UIImage imageNamed:@"name.png"] 
                  forState:UIControlStateNormal];

[self.view addSubview:btnTwo];

Questa parte del codice mi ha confuso. <code> btnImage = [UIImage imageNamed: @ "image.png"]; </code> Che cos'è btnImage? Non era nel codice originale. È un nuovo pulsante?
— Mike Martin,

puoi impostare direttamente l'immagine del pulsante invece di prendere un altro oggetto immagine come questo: [btnTwo setImage: [UIImage imageNamed: @ "image.png"]];
— Ajay Sharma,

devi avere buttonWithType: UIButtonTypeRoundedRect su UIButtonType L'altro pulsante saggio personalizzato non verrà visualizzato come da immagine.
— Praveen-K,

2

Stavo cercando una soluzione per aggiungere un UIImageal mio UIButton. Il problema era solo che visualizza l'immagine più grande del necessario. Mi ha appena aiutato con questo:

_imageViewBackground = [[UIImageView alloc] initWithFrame:rectImageView];
_imageViewBackground.image = [UIImage imageNamed:@"gradientBackgroundPlain"];
[self addSubview:_imageViewBackground];
[self insertSubview:_imageViewBackground belowSubview:self.label];
_imageViewBackground.hidden = YES;

Ogni volta che voglio visualizzare il mio UIImageViewho appena impostato il var hiddensu YESo NO. Potrebbero esserci altre soluzioni, ma mi sono confuso così tante volte con questa roba e questo l'ha risolto e non ho avuto bisogno di occuparmi di cose interne che UIButtonstanno facendo in background.


2

Non preoccuparti così tanto di inquadrare il pulsante dal codice, puoi farlo sullo storyboard. Questo ha funzionato per me, una riga ... più semplice.

[self.button setBackgroundImage:[UIImage imageNamed: @"yourPic.png"] forState:UIControlStateNormal];

2
-(void)buttonTouched:(id)sender
{
    UIButton *btn = (UIButton *)sender;

    if( [[btn imageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"icon-Locked.png"]])
    {
        [btn setImage:[UIImage imageNamed:@"icon-Unlocked.png"] forState:UIControlStateNormal];
        // other statements....
    }
    else
    {
        [btn setImage:[UIImage imageNamed:@"icon-Locked.png"] forState:UIControlStateNormal];
        // other statements....
    }
}

2

Versione Swift 3 (butt_img deve essere una Image Set nella cartella Assets.xcassets o Images.xcassets in Xcode):

btnTwo.setBackgroundImage(UIImage(named: "butt_img"), for: .normal)
btnTwo.setTitle("My title", for: .normal)

Ad ogni modo, se si desidera ridimensionare l'immagine in modo da riempire le dimensioni del pulsante, è possibile aggiungerne una UIImageViewe assegnarla all'immagine:

let img = UIImageView()
img.frame = btnTwo.frame
img.contentMode = .scaleAspectFill
img.clipsToBounds = true
img.image = UIImage(named: "butt_img")
btnTwo.addSubview(img)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.