UIButton Image + Text IOS


129

Ho bisogno di un UIButtoncon immagine e testo . L'immagine dovrebbe essere in alto e il testo verrà visualizzato sotto l'immagine, entrambi dovrebbero essere cliccabili.


Spero che questo ti aiuti, vedi [UiButton con TEXT e IMMAGINE] [1] stackoverflow.com/questions/4926581/… [1]: stackoverflow.com/questions/4926581/… Puoi quindi aggiungere un UITapGestureRecognizer sulla tua vista per gestire custombutton scatti.
Humayun Ghani,

22
Sembra più una specifica dei requisiti che una domanda.
Abizern,

Vedere la risposta accettata e questo commandshift.co.uk/blog/2013/03/12/uibutton-edge-insets circa UIButton Bordi
onmyway133

Risposte:


308

Vedo risposte molto complicate, tutte usando il codice. Tuttavia, se si utilizza Interface Builder , esiste un modo molto semplice per farlo:

  1. Seleziona il pulsante e imposta un titolo e un'immagine. Notare che se si imposta lo sfondo anziché l'immagine, l'immagine verrà ridimensionata se è più piccola del pulsante.Immagine e titolo di base IB
  2. Imposta la posizione di entrambi gli elementi modificando il bordo e le inserzioni. Puoi persino controllare l'allineamento di entrambi nella sezione Controllo.

Posizione IB impostata IB Control set

Potresti persino usare lo stesso approccio per codice, senza creare UILabels e UIImages all'interno come altre soluzioni proposte. Sempre semplice!

EDIT: in allegato un piccolo esempio con le 3 cose impostate (titolo, immagine e sfondo) con inserti corretti Anteprima del pulsante


2
Questo è corretto. Ti consigliamo di utilizzare gli inserti dei bordi sul titolo e sull'immagine per allineare i due correttamente. Puoi farlo nel codice impostando le proprietà titleEdgeInsets e contentEdgeInsets.
Tim Mahoney

4
si, è quasi corretto. devi solo impostare l' Backgroundimmagine invece di Image, altrimenti non vedrai il titolo e nemmeno impostare i valori dell'inserzione per riposizionare il titolo.
Holex,

6
Ho avuto problemi anche con questo. Se il titolo non viene visualizzato, prova a impostare un offset sinistro negativo per esso. Sembra che IB lo spinga automaticamente verso destra dell'immagine.
brians

8
Questo visualizza solo l'immagine e il testo fianco a fianco, giusto? C'è un modo per cambiare l'orientamento dall'alto verso il basso? Questo è ciò che afferma la domanda originale e quello che sto cercando. Grazie!
flohei

12
Per quelli che usano Xcode 8, potresti non vedere la proprietà Edge. Il testo potrebbe scomparire anche dopo aver aggiunto un'immagine. Cambia il testo in bianco e se ti trovi su uno sfondo bianco, sembra che sia scomparso. Cambia il colore del testo e apparirà vicino all'immagine. È possibile regolare le inserzioni in Impostazioni dimensioni.
Micah Montoya,

67

Penso che tu stia cercando questa soluzione per il tuo problema:

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

... il resto della personalizzazione del pulsante è tuo dovere ora, e non dimenticare di aggiungere il pulsante alla tua vista.

AGGIORNAMENTO # 1 e AGGIORNAMENTO # 2

oppure, se non hai bisogno di un pulsante dinamico, puoi aggiungere il pulsante alla tua vista in Interface Builder e puoi impostare gli stessi valori anche lì. è abbastanza lo stesso, ma ecco anche questa versione in una semplice immagine.

si può anche vedere il risultato finale in Interface Builder come è nello screenshot.

inserisci qui la descrizione dell'immagine


EdgeInsets funziona solo quando hai "imposta l'immagine pulsante" e quando imposti l'immagine pulsante non puoi vedere il titolo. E se si imposta l'immagine di sfondo, EdgeInsets non può essere applicato all'immagine. e puoi vedere il titolo. Quindi, non è possibile impostare edgeinsect su entrambi contemporaneamente.
Badal Shah,

@BadalShah, sì, ci sono alcuni scenari (a seconda della dimensione del pulsante, della dimensione dell'immagine, della lunghezza del titolo, ecc ...) quando ciò che hai detto è vero e non puoi vedere il titolo e l' immagine allo stesso tempo perché l' immagine espelle il titolo dell'area visibile; ma quello scenario non è affatto generico, la situazione generica è che sia il titolo che l' immagine potrebbero e appariranno allo stesso tempo.
Holex,

32

Xcode-9 e Xcode-10 Apple ha apportato alcune modifiche a Edge Inset ora, è possibile modificarlo in Controllo dimensioni.

Seguire i passaggi seguenti:

Passaggio 1: inserisci il testo e seleziona l'immagine che desideri mostrare:

inserisci qui la descrizione dell'immagine

Passaggio 2: selezionare il controllo pulsante in base alle proprie esigenze, come mostrato nell'immagine seguente:

inserisci qui la descrizione dell'immagine

Passaggio 3: ora vai all'ispettore delle dimensioni e aggiungi valore in base alle tue esigenze:

inserisci qui la descrizione dell'immagine


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

ma il codice seguente mostrerà l'etichetta sopra e l'immagine sullo sfondo

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

Non è necessario utilizzare etichetta e pulsante nello stesso controllo poiché UIButton ha proprietà UILabel e UIimageview.


1
Ho bisogno di posizionare l'immagine in alto e il testo sotto l'immagine dovrebbe essere cliccabile entrambi.
Codesen

4

Usa questo codice:

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

Usa questo codice:

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

Ho riscontrato lo stesso problema e lo risolvo creando una nuova sottoclasse UIButtone sovrascrivendo il layoutSubviews:metodo come di seguito:

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

}

Penso che la risposta di Angel García Olloqui sia un'altra buona soluzione, se le metti tutte manualmente con il builder di interfacce, ma manterrò la mia soluzione poiché non devo modificare le inserzioni di contenuto per ciascuno dei miei pulsanti.


4

Crea UIImageViewe UILabel, e imposta immagine e testo su entrambi .... quindi Posiziona un pulsante personalizzato su imageView ed Etichetta ....

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

Semplice e utile. Come impostare l'immagine e il titolo evidenziati?
DawnSong,

per set di etichetteHighlightedTextColor e devi giocare con forControlEvents
Rajneesh071

3

È necessario creare una visualizzazione immagine personalizzata per l'immagine e un'etichetta personalizzata per il testo e aggiungerla al pulsante come visualizzazioni secondarie. Questo è tutto.

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

A scopo di test, utilizzare il yourButtonSelected:metodo

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

}

Penso che ti sarà utile.


3

È davvero semplice, basta aggiungere un'immagine allo sfondo del tuo pulsante e dare un testo al nome del pulsante per uicontrolstatenormal. Questo è tutto.

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

4
... e come va il testo sotto l'immagine?
Holex,

@holex: Grazie mille per avermi diretto, ho trovato un difetto e poi sono cambiato di conseguenza.
Dhruv,

1

versione rapida:

var button = UIButton()

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.