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.