Image UIButton + Texte IOS


129

J'ai besoin d' une UIButtonavec l' image et le texte . L'image doit être en haut et le texte vient sous l'image, les deux doivent être cliquables.


J'espère que cela aide, voir [UiButton avec TEXT et IMAGE] [1] stackoverflow.com/questions/4926581/… [1]: stackoverflow.com/questions/4926581/… Vous pouvez ensuite ajouter un UITapGestureRecognizer sur votre vue pour gérer le bouton personnalisé clics.
Humayun Ghani

22
Cela ressemble plus à une spécification d'exigence qu'à une question.
Abizern

Voir la réponse acceptée et ce commandshift.co.uk/blog/2013/03/12/uibutton-edge-insets sur UIButton Edges
onmyway133

Réponses:


308

Je vois des réponses très compliquées, toutes utilisant du code. Cependant, si vous utilisez Interface Builder , il existe un moyen très simple de le faire:

  1. Sélectionnez le bouton et définissez un titre et une image. Notez que si vous définissez l'arrière-plan au lieu de l'image, l'image sera redimensionnée si elle est plus petite que le bouton.Image et titre de base de l'IB
  2. Définissez la position des deux éléments en modifiant le bord et les encarts. Vous pouvez même contrôler l'alignement des deux dans la section Contrôle.

Jeu de positions IB Ensemble de contrôle IB

Vous pouvez même utiliser la même approche par code, sans créer des UILabels et UIImages à l'intérieur comme d'autres solutions proposées. Restez toujours simple!

EDIT: joint un petit exemple ayant les 3 choses définies (titre, image et arrière-plan) avec des encarts corrects Aperçu du bouton


2
C'est correct. Vous voudrez utiliser les encarts de bord sur le titre et l'image pour aligner correctement les deux. Vous pouvez le faire dans le code en définissant les propriétés titleEdgeInsets et contentEdgeInsets.
Tim Mahoney

4
oui, c'est presque correct. il vous suffit de définir l' Backgroundimage au lieu de Image, sinon vous ne verrez pas le titre ni même définir les valeurs d'encart pour repositionner le titre.
holex

6
J'ai eu des problèmes avec ça aussi. Si votre titre ne s'affiche pas, essayez de lui définir un décalage gauche négatif. Il semble qu'IB le pousse automatiquement à droite de l'image.
brians

8
Cela n'affiche que l'image et le texte côte à côte, non? Existe-t-il un moyen de changer l'orientation de haut en bas? C'est ce que dit la question initiale et ce que je recherche également. Merci!
flohei

12
Pour ceux qui utilisent Xcode 8, vous pouvez ne pas voir la propriété Edge. Le texte peut également disparaître après l'ajout d'une image. Cela change le texte en blanc et si vous êtes sur un fond blanc, il semble qu'il a disparu. Changez la couleur du texte et il apparaîtra près de l'image. Vous pouvez ajuster les encarts sous l'inspecteur de taille.
Micah Montoya

67

Je pense que vous recherchez cette solution pour votre problème:

UIButton *_button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setFrame:CGRectMake(0.f, 0.f, 128.f, 128.f)]; // SET the values for your wishes
[_button setCenter:CGPointMake(128.f, 128.f)]; // SET the values for your wishes
[_button setClipsToBounds:false];
[_button setBackgroundImage:[UIImage imageNamed:@"jquery-mobile-icon.png"] forState:UIControlStateNormal]; // SET the image name for your wishes
[_button setTitle:@"Button" forState:UIControlStateNormal];
[_button.titleLabel setFont:[UIFont systemFontOfSize:24.f]];
[_button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; // SET the colour for your wishes
[_button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; // SET the colour for your wishes
[_button setTitleEdgeInsets:UIEdgeInsetsMake(0.f, 0.f, -110.f, 0.f)]; // SET the values for your wishes
[_button addTarget:self action:@selector(buttonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside]; // you can ADD the action to the button as well like

... le reste de la personnalisation du bouton est de votre devoir maintenant, et n'oubliez pas d'ajouter le bouton à votre vue.

MISE À JOUR N ° 1 et MISE À JOUR N ° 2

ou, si vous n'avez pas besoin d'un bouton dynamique, vous pouvez ajouter votre bouton à votre vue dans Interface Builder et vous pouvez également définir les mêmes valeurs ici. c'est à peu près la même chose, mais voici cette version également en une simple image.

vous pouvez également voir le résultat final dans Interface Builder tel qu'il est sur la capture d'écran.

entrez la description de l'image ici


EdgeInsets ne fonctionne que lorsque vous avez "définir l'image du bouton" et lorsque vous définissez l'image du bouton, vous ne pouvez pas voir le titre. Et si vous définissez l'image d'arrière-plan, EdgeInsets ne peut pas s'appliquer à l'image. et vous pouvez voir le titre. Ainsi, vous ne pouvez pas définir edgeinsect sur les deux en même temps.
Badal Shah

@BadalShah, oui, il y a des scénarios (selon la taille du bouton, la taille de l'image, la longueur du titre, etc ...) où ce que vous avez dit est vrai et que vous ne pouvez pas voir le titre et l' image en même temps parce que l' image repousse le titre de la zone visible; mais ce scénario n'est pas du tout générique, la situation générique est que le titre et l' image pourraient et apparaîtront en même temps.
holex

32

Xcode-9 et Xcode-10 Apple ont fait quelques changements concernant Edge Inset maintenant, vous pouvez le changer sous l'inspecteur de taille.

Veuillez suivre les étapes ci-dessous:

Étape 1: saisissez le texte et sélectionnez l'image que vous souhaitez afficher:

entrez la description de l'image ici

Étape-2: Sélectionnez le contrôle du bouton selon vos besoins, comme indiqué dans l'image ci-dessous:

entrez la description de l'image ici

Étape 3: Maintenant, passez à l'inspecteur de taille et ajoutez de la valeur selon vos besoins:

entrez la description de l'image ici


9
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.imageView.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

mais le code suivant affichera l'étiquette ci-dessus et l'image en arrière-plan

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.background.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

Il n'est pas nécessaire d'utiliser l'étiquette et le bouton dans le même contrôle car UIButton a des propriétés UILabel et UIimageview.


1
J'ai besoin de positionner l'image en haut et le texte sous l'image doit être cliquable.
Codesen

4

Utilisez ce code:

UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.imageView.frame=CGRectMake(0.0f, 0.0f, 50.0f, 44.0f);///You can replace it with your own dimensions.
    UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0.0f, 35.0f, 50.0f, 44.0f)];///You can replace it with your own dimensions.
    [button addSubview:label];

4

Utilisez ce code:

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:CGRectMake(0, 10, 200, 52)];
[sampleButton setTitle:@"Button Title" forState:UIControlStateNormal];
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]];
[sampleButton setBackgroundImage:[[UIImage imageNamed:@"redButton.png"] 
stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
[sampleButton addTarget:self action:@selector(buttonPressed)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:sampleButton]

4

J'ai rencontré le même problème et je le corrige en créant une nouvelle sous-classe de UIButtonet en remplaçant la layoutSubviews:méthode comme ci-dessous:

-(void)layoutSubviews {
    [super layoutSubviews];

    // Center image
    CGPoint center = self.imageView.center;
    center.x = self.frame.size.width/2;
    center.y = self.imageView.frame.size.height/2;
    self.imageView.center = center;

    //Center text
    CGRect newFrame = [self titleLabel].frame;
    newFrame.origin.x = 0;
    newFrame.origin.y = self.imageView.frame.size.height + 5;
    newFrame.size.width = self.frame.size.width;

    self.titleLabel.frame = newFrame;
    self.titleLabel.textAlignment = UITextAlignmentCenter;

}

Je pense que la réponse d'Angel García Olloqui est une autre bonne solution, si vous les placez toutes manuellement avec le constructeur d'interface, mais je garderai ma solution car je n'ai pas à modifier les encarts de contenu pour chacun de mes boutons.


4

Créez UIImageViewet UILabel, et définissez l'image et le texte sur les deux ... puis placez un bouton personnalisé sur imageView et Label ....

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.png"]];
    imageView.frame = CGRectMake(x, y, imageView.frame.size.width, imageView.frame.size.height);
    [self.view addSubview:imageView];

UILabel *yourLabel = [[UILabel alloc] initWithFrame:CGRectMake(x, y,a,b)];
yourLabel.text = @"raj";
[self.view addSubview:yourLabel];

UIButton * yourBtn=[UIButton buttonWithType:UIButtonTypeCustom];
[yourBtn setFrame:CGRectMake(x, y,c,d)];
[yourBtn addTarget:self action:@selector(@"Your Action") forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:yourBtn];  

Simple et utile. Comment définir l'image et le titre en surbrillance?
DawnSong

pour lable setHighlightedTextColor et vous devez jouer avec forControlEvents
Rajneesh071

3

Vous devez créer une vue d'image personnalisée pour l'image et une étiquette personnalisée pour le texte et ajouter à votre bouton en tant que sous-vues. C'est tout.

UIButton *yourButton = [UIButton buttonWithType:UIButtonTypeCustom];
yourButton.backgroundColor = [UIColor greenColor];
yourButton.frame = CGRectMake(140, 40, 175, 30);     
[yourButton addTarget:self action:@selector(yourButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:yourButton];

UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, yourButton.frame.size.width, yourButton.frame.size.height/2)];
imageView1.image =[UIImage imageNamed:@"images.jpg"];
[yourButton addSubview:imageView1];

UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, yourButton.frame.size.height/2, yourButton.frame.size.width, yourButton.frame.size.height/2)];
label.backgroundColor = [UIColor greenColor];
label.textAlignment= UITextAlignmentCenter;
label.text = @"ButtonTitle";
[yourButton addSubview:label];

À des fins de test, utilisez la yourButtonSelected:méthode

-(void)yourButtonSelected:(id)sender{
    NSLog(@"Your Button Selected");

}

Je pense que cela vous sera utile.


3

C'est vraiment simple, il suffit d'ajouter l'image à l'arrière-plan de votre bouton et de donner du texte au titre du bouton pour uicontrolstatenormal. C'est tout.

[btn setBackgroundImage:[UIImage imageNamed:@"img.png"] forState:UIControlStateNormal];
[btn setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
[btn setTitle:@"Click Me" forState:UIControlStateNormal];

4
... et comment le texte passe-t-il sous l'image?
holex

@holex: Merci beaucoup de m'avoir dirigé, j'ai trouvé un défaut et j'ai changé en conséquence.
Dhruv

1

version rapide:

var button = UIButton()

newGameButton.setTitle("Новая игра", for: .normal)
newGameButton.setImage(UIImage(named: "energi"), for: .normal)
newGameButton.backgroundColor = .blue
newGameButton.imageEdgeInsets.left = -50

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.