Establecer una imagen para un UIButton en código

197

¿Cómo se configura la imagen para un UIButton en el código?

Tengo esto:

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

pero no veo qué establecerá la imagen para ello.

Spanky
fuente

Respuestas:

400

C objetivo

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
fuente
1
Como nota al margen: esto mostrará la imagen, pero el texto del título del botón estará oculto.
leviatán
Este código funciona completamente, pero obtengo una imagen con el análisis, así que, ¿cómo puedo hacer esto? ¿Cómo puedo hacer esto con UIButton ... ¿Me puede ayudar ...
user755278
1
@slcott, ¿dónde dice eso la documentación ? No veo que sugiera ningún lugar que setImageesté en desuso. (Me parece que está confundiendo UIButton.setImagecon UITableViewCell.image, que es una característica obsoleta, ya que usted indicó.)
Kirk Woll
12
Atención: si usa algo más que UIButtonTypeCustom, la imagen será azul en iOS7 y 8.
Apfelsaft
2
Para Swift 3: btnTwo.setImage (btnImage, para: UIControlState.normal)
Micah Montoya
57

La solución de Mike solo mostrará la imagen, pero cualquier título establecido en el botón no será visible, ya que puede establecer el título o la imagen.

Si desea configurar ambos (su imagen y título) use el siguiente código:

btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setBackgroundImage:btnImage forState:UIControlStateNormal];
[btnTwo setTitle:@"Title" forState:UIControlStateNormal];
leviatán
fuente
2
¿ Cuál es la diferencia entre setImage y setBackgroundImage ?
onmyway133
3
setBackgroundImage estirará la imagen sobre el ancho del botón sobre el texto del título, mientras que setImage hará que el botón sea una imagen que ignore el texto del título sin estirar la imagen.
Ernest
21

Antes de que esto funcionara para mí, tuve que cambiar el tamaño del marco del botón explícitamente según el tamaño del marco de la imagen.

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
fuente
@jrasmusson solo quería agregar que las 3 líneas de violín con el marco también se pueden escribir[listButton sizeToFit]
bk138
10

En caso de 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) 
Sruit A.Suk
fuente
9

Puedes hacerlo asi

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

Puede poner la imagen de cualquiera de las siguientes maneras:

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
fuente
Esta parte del código me tiene confundido. <code> btnImage = [UIImage imageNamed: @ "image.png"]; </code> ¿Qué es btnImage? Eso no estaba en el código original. ¿Es ese un nuevo botón?
Mike Martin
puede configurar directamente la imagen del botón en lugar de tomar otro objeto de imagen como este: [btnDos setImage: [UIImage imageNamed: @ "image.png"]];
Ajay Sharma
debe tener buttonWithType: UIButtonTypeRoundedRect to UIButtonTypeCustom, el otro botón personalizado no se mostrará como su imagen.
Praveen-K
2

Estaba buscando una solución para agregar un UIImagea mi UIButton. El problema era que solo mostraba la imagen más grande de lo necesario. Solo me ayudó con esto:

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

Cada vez que quiero mostrar mi UIImageViewsolo configuro la var hiddenen YESo NO. Puede haber otras soluciones, pero me confundí muchas veces con estas cosas y esto lo resolvió y no tuve que lidiar con cosas internas que UIButtonestán haciendo en segundo plano.

Alex Cio
fuente
2

No se preocupe tanto enmarcando el botón del código, puede hacerlo en el guión gráfico. Esto funcionó para mí, una línea ... más simple.

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

Versión Swift 3 (butt_img debe ser un conjunto de imágenes en la carpeta Assets.xcassets o Images.xcassets en Xcode):

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

De todos modos, si desea que la imagen se ajuste a escala para llenar el tamaño del botón, puede agregar un UIImageViewsobre y asignarle su imagen:

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