Définition d'une image pour un bouton UIB dans le code

197

Comment définissez-vous l'image d'un UIButton dans le code?

J'ai ceci:

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

mais ne voyez pas ce qui définira l'image pour cela.

Spanky
la source

Réponses:

400

Objectif 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
la source
1
En tant que sidenote: cela affichera l'image, mais le texte du titre du bouton sera masqué.
leviathan
C'est du code qui fonctionne complètement mais j'obtiens une image avec l'analyse alors comment puis-je faire cela car ce code est travaillé pour moi dans le cas UIImage: - largePick.image = aNewsInfo.smallImageData; comment puis-je faire cela avec UIButton ... Pouvez-vous m'aider ...
user755278
1
@slcott, où la documentation l' indique-t-elle? Je ne vois pas cela suggérer un endroit setImageobsolète. (Il me semble que vous confondez UIButton.setImageavec UITableViewCell.image, ce qui est une propriété OBSOLETE que vous avez dit.)
Kirk Woll
12
Attention: Si vous utilisez autre chose que UIButtonTypeCustom, l'image sera bleue dans iOS7 et 8.
Apfelsaft
2
Pour Swift 3: btnTwo.setImage (btnImage, pour: UIControlState.normal)
Micah Montoya
57

La solution de Mike affichera simplement l'image, mais tout titre défini sur le bouton ne sera pas visible, car vous pouvez définir le titre ou l'image.

Si vous souhaitez définir les deux (votre image et votre titre), utilisez le code suivant:

btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setBackgroundImage:btnImage forState:UIControlStateNormal];
[btnTwo setTitle:@"Title" forState:UIControlStateNormal];
Léviathan
la source
2
Quelle est la différence entre setImage et setBackgroundImage ?
onmyway133
3
setBackgroundImage étirera l'image sur la largeur du bouton sur le texte de votre titre tandis que setImage fera du bouton une image ignorant le texte du titre sans étirer l'image.
Ernest
21

Avant que cela ne fonctionne pour moi, j'ai dû redimensionner le cadre du bouton explicitement en fonction de la taille du cadre de l'image.

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
la source
@jrasmusson voulait juste ajouter que les 3 lignes de jeu avec le cadre peuvent également être écrites[listButton sizeToFit]
bk138
10

En cas d'utilisateur Swift

// 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
la source
9

Vous pouvez le faire comme ça

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

Vous pouvez mettre l'image de l'une ou l'autre façon:

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
la source
Cette partie du code m'a embrouillé. <code> btnImage = [UIImage imageNamed: @ "image.png"]; </code> Qu'est-ce que btnImage? Ce n'était pas dans le code d'origine. Est-ce un nouveau bouton?
Mike Martin
vous pouvez définir directement l'image du bouton au lieu de prendre un autre objet image comme celui-ci: [btnTwo setImage: [UIImage imageNamed: @ "image.png"]];
Ajay Sharma
vous devez avoir buttonWithType: UIButtonTypeRoundedRect à UIButtonTypeCustom autre bouton sage ne s'affichera pas selon votre image.
Praveen-K
2

Je cherchais une solution pour ajouter un UIImageà mon UIButton. Le problème était simplement qu'il affiche l'image plus grande que nécessaire. Je viens de m'aider avec ça:

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

Chaque fois que je veux afficher mon, UIImageViewje règle simplement la var hiddensur YESou NO. Il pourrait y avoir d'autres solutions, mais je me suis confondu tellement de fois avec ce genre de choses et cela l'a résolu et je n'avais pas besoin de gérer les choses internes UIButtonen arrière-plan.

Alex Cio
la source
2

Ne vous inquiétez pas tellement de l'encadrement du bouton à partir du code, vous pouvez le faire sur le storyboard. Cela a fonctionné pour moi, une ligne ... plus simple.

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

Version Swift 3 (butt_img doit être un ensemble d'images dans le dossier Assets.xcassets ou Images.xcassets dans Xcode):

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

Quoi qu'il en soit, si vous souhaitez que l'image soit mise à l'échelle pour remplir la taille du bouton, vous pouvez ajouter un UIImageViewdessus et lui affecter votre image:

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