2009-09-24 3 views
169

Comment définir l'image pour un UIButton dans le code?Définition d'une image pour 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 vois pas ce qui va définir l'image pour elle.

Répondre

350

Objective-C

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

Swift

let btnImage = UIImage(named: "image") 
btnTwo.setImage(btnImage , forState: UIControlState.Normal) 
+1

Comme un sidenote: cela montrera l'image, mais le texte du titre du bouton sera caché. – leviathan

+0

Ceci est le code fonctionne pleinement, mais je reçois l'image avec l'analyse alors comment puis-je fait cela comme ce code est travaillé pour moi dans le cas UIImage: - largePick.image = aNewsInfo.smallImageData; comment puis-je faire avec UIButton ... Pouvez-vous m'aider ... – user755278

+1

@slcott, où est-ce que [la documentation] (http://developer.apple.com/library/ios/#documentation/UIKit/ Référence/UIButton_Class/UIButton/UIButton.html) indique que? Je ne vois pas cela suggérer que 'setImage' soit obsolète. (Il me semble que vous confondez 'UIButton.setImage' avec' UITableViewCell.image', qui * est * une propriété obsolète comme vous l'avez dit.) –

56

solution de Mike va juste montrer l'image, mais un titre situé sur le bouton ne sera pas visible, parce que vous pouvez définir le titre ou l'image.

Si vous voulez définir à la fois (l'image et le titre), utilisez le code suivant:

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

Quelle est la différence entre ** setImage ** et ** setBackgroundImage **? – onmyway133

+3

setBackgroundImage étire l'image sur la largeur du bouton par-dessus le texte de votre titre, tandis que setImage fait du bouton une image qui ignore le texte du titre sans étirer l'image. – Ernest

8

Vous pouvez mettre l'image soit de la voie:

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

Cette partie du code m'a embrouillé. btnImage = [UIImage imageNamed:@"image.png"]; Qu'est-ce que btnImage? Ce n'était pas dans le code original. Est-ce un nouveau bouton? –

+0

vous pouvez directement définir l'image du bouton au lieu de prendre un autre objet image comme ceci: [btnTwo setImage: [UIImage imageNamed: @ "image.png"]]; –

+0

vous devez avoir buttonWithType: UIButtonTypeRoundedRect à UIButtonTypeCustom autre bouton sage ne s'affiche pas en tant que votre image. –

21

Avant cela fonctionnerait pour moi, j'ai dû redimensionner le cadre du bouton explicitement en fonction de la taille 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; 
+0

Cette astuce de redimensionnement des boutons est très utile. –

+0

@jrasmusson voulais juste ajouter que les 3 lignes de bidouillage avec le cadre peuvent aussi être écrites dans '[[listButton sizeToFit]]' – bk138

9

Vous pouvez le faire comme ça

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

Je cherchais une solution pour ajouter un UIImage à mon UIButton. Le problème était simplement que l'image était plus grande que nécessaire. Tout m'a aidé avec ceci:

_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 montrer mon UIImageView Je viens de mettre le var hidden-YES ou NO. Il y a peut-être d'autres solutions, mais j'ai été tellement confuse avec ce genre de choses et cela l'a résolu et je n'avais pas besoin de faire face à des choses internes que fait UIButton en arrière-plan.

8

En cas de Swift utilisateur

// 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) 
2

Ne vous inquiétez pas tant d'encadrement sur le bouton de code, vous pouvez le faire sur le story-board. Cela a fonctionné pour moi, une ligne ... plus simple.

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

Swift version 3 (butt_img doit être une image Érigé sur Assets.xcassets ou Images.xcassets dossier dans Xcode):

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

Quoi qu'il en soit, si vous voulez que l'image à l'échelle pour remplir la taille du bouton, vous pouvez ajouter un UIImageView dessus et lui attribuer votre image:

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