Definindo uma imagem para um UIButton no código

197

Como você define a imagem para um UIButton no código?

Eu tenho isto:

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];

mas não veja o que definirá a imagem para ele.

Spanky
fonte

Respostas:

400

Objetivo-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)
Mike W
fonte
1
Como nota de rodapé: isso mostrará a imagem, mas o texto do título do botão ficará oculto.
precisa
Este código está funcionando perfeitamente, mas estou obtendo imagem com análise. Como posso fazer isso, pois esse código é trabalhado para mim no caso UIImage: - largePick.image = aNewsInfo.smallImageData; Como posso fazer isso com UIButton ... Você pode me ajudar ...
user755278
1
@slcott, onde a documentação afirma isso? Não vejo isso sugerido em nenhum lugar que setImagefoi descontinuado. (Parece-me que você está confundindo UIButton.setImagecom UITableViewCell.image, que é uma propriedade obsoleta como você disse.)
Kirk Woll
12
Atenção: Se você usar qualquer outra coisa do que UIButtonTypeCustom, a imagem será azul em iOS7 e 8.
Apfelsaft
2
Para Swift 3: btnTwo.setImage (btnImage, para: UIControlState.normal)
Micah Montoya
57

A solução de Mike mostrará apenas a imagem, mas qualquer título definido no botão não ficará visível, porque você pode definir o título ou a imagem.

Se você deseja definir ambos (sua imagem e título), use o seguinte código:

btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setBackgroundImage:btnImage forState:UIControlStateNormal];
[btnTwo setTitle:@"Title" forState:UIControlStateNormal];
leviatã
fonte
2
qual é a diferença entre setImage e setBackgroundImage ?
onmyway133
3
setBackgroundImage esticará a imagem sobre a largura do botão sobre o texto do título, enquanto setImage fará do botão uma imagem que ignora o texto do título sem esticar a imagem.
Ernest
21

Antes que isso funcionasse para mim, tive que redimensionar o quadro do botão explicitamente com base no tamanho do quadro da imagem.

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
fonte
@jrasmusson só queria acrescentar que as 3 linhas de mexer com a estrutura também pode ser escrito em[listButton sizeToFit]
bk138
10

Em caso de usuário rápido

// 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) 
Sruit A.Suk
fonte
9

Você pode fazer assim

[btnTwo setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
Azhar
fonte
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];
Gaurav Gilani
fonte
8

Você pode colocar a imagem de qualquer maneira:

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];
Ajay Sharma
fonte
Esta parte do código me deixou confusa. <code> btnImage = [UIImage imageNamed: @ "image.png"]; </code> O que é btnImage? Isso não estava no código original. Esse é um novo botão?
Mike Martin
você pode definir diretamente a imagem do botão em vez de usar outro objeto de imagem como este: [btnTwo setImage: [UIImage imageNamed: @ "image.png"]];
Ajay Sharma
você precisa ter buttonWithType: UIButtonTypeRoundedRect a UIButtonTypeCustom outro botão inteligente não será exibido conforme sua imagem.
Praveen-K
2

Eu estava procurando uma solução para adicionar um UIImageao meu UIButton. O problema é que ele exibe a imagem maior que o necessário. Apenas me ajudou com isso:

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

Toda vez que quero exibir meu UIImageView, apenas defino o var hiddencomo YESou NO. Pode haver outras soluções, mas eu me confundi muitas vezes com essas coisas e isso resolveu, e eu não precisava lidar com coisas internas que UIButtonestão fazendo em segundo plano.

Alex Cio
fonte
2

Não se preocupe tanto em enquadrar o botão no código, você pode fazer isso no storyboard. Isso funcionou para mim, uma linha ... mais simples.

[self.button setBackgroundImage:[UIImage imageNamed: @"yourPic.png"] forState:UIControlStateNormal];
Peter Schultz
fonte
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....
    }
}
Leemboy
fonte
2

Swift 3 versão (butt_img deve ser um conjunto de Imagem em Assets.xcassets ou Images.xcassets pasta no Xcode):

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

De qualquer forma, se você quiser que a imagem seja dimensionada para preencher o tamanho do botão, adicione um UIImageViewexcesso e atribua a sua imagem:

let img = UIImageView()
img.frame = btnTwo.frame
img.contentMode = .scaleAspectFill
img.clipsToBounds = true
img.image = UIImage(named: "butt_img")
btnTwo.addSubview(img)
Frank Eno
fonte