Imagem UIButton + Texto IOS

129

Eu preciso de um UIButtoncom imagem e texto . A imagem deve estar na parte superior e o texto está embaixo da imagem, ambos devem ser clicáveis.

Codesen
fonte
Espero que isso ajude. Consulte [UiButton with TEXT and IMAGE] [1] stackoverflow.com/questions/4926581/… [1]: stackoverflow.com/questions/4926581/… Você pode adicionar um UITapGestureRecognizer em sua exibição para manipular o botão customizado cliques.
Humayun Ghani
22
Parece mais uma especificação de requisitos do que uma pergunta.
Abizern
Veja a resposta aceita e este commandshift.co.uk/blog/2013/03/12/uibutton-edge-insets sobre UIButton Edges
onmyway133

Respostas:

308

Eu vejo respostas muito complicadas, todas usando código. No entanto, se você estiver usando o Interface Builder , existe uma maneira muito fácil de fazer isso:

  1. Selecione o botão e defina um título e uma imagem. Observe que, se você definir o plano de fundo em vez da imagem, a imagem será redimensionada se for menor que o botão.Imagem e título básico da IB
  2. Defina a posição dos dois itens alterando a aresta e as inserções. Você pode até controlar o alinhamento de ambos na seção Controle.

Conjunto de posições IB Conjunto de controle IB

Você pode até usar a mesma abordagem por código, sem criar UILabels e UIImages dentro das outras soluções propostas. Mantenha-o sempre simples!

EDIT: anexado um pequeno exemplo com as 3 coisas definidas (título, imagem e plano de fundo) com inserções corretas Visualização do botão

Angel G. Olloqui
fonte
2
Isto está certo. Você desejará usar as inserções de borda no título e na imagem para alinhar os dois corretamente. Você pode fazer isso no código, definindo as propriedades titleEdgeInsets e contentEdgeInsets.
Tim Mahoney
4
sim, está quase correto. você só precisa definir a Backgroundimagem em vez de Image, caso contrário você não verá o título nem definirá os valores inseridos para reposicionar o título.
holex
6
Eu também tive problemas com isso. Se o seu título não estiver aparecendo, tente definir um deslocamento esquerdo negativo para ele. Parece que o IB empurra-o automaticamente para a direita da imagem.
Brian
8
Isso mostra apenas a imagem e o texto lado a lado, certo? Existe uma maneira de alterar a orientação de cima para baixo? Isso é o que a pergunta original afirma e o que estou procurando também. Obrigado!
flohei
12
Para aqueles que usam o Xcode 8, talvez você não veja a propriedade Edge. O texto pode desaparecer depois de adicionar uma imagem também. Ele muda o texto para branco e, se você estiver em um fundo branco, parece que desapareceu. Mude a cor do texto e ele aparecerá próximo à imagem. Você pode ajustar as inserções no Inspetor de tamanho.
Micah Montoya
67

Acho que você está procurando esta solução para o seu 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

... o restante da personalização do botão é seu dever agora e não se esqueça de adicionar o botão à sua visualização.

ATUALIZAÇÃO # 1 e ATUALIZAÇÃO # 2

ou, se você não precisar de um botão dinâmico, poderá adicioná-lo à sua exibição no Interface Builder e também poderá definir os mesmos valores. é bem parecido, mas aqui está essa versão também em uma imagem simples.

você também pode ver o resultado final no Interface Builder, como está na captura de tela.

insira a descrição da imagem aqui

holex
fonte
O EdgeInsets funciona apenas quando você tem "definir imagem do botão" e quando você define a imagem do botão, não pode ver o título. E se você definir a imagem de plano de fundo, o EdgeInsets não poderá se aplicar à imagem. e você pode ver o título. Portanto, você não pode definir edgeinsect para ambos ao mesmo tempo.
Badal Shah
@BadalShah, sim, existem alguns cenários (dependendo do tamanho do botão, tamanho da imagem, comprimento do título, etc ...) quando o que você disse é verdadeiro e você não pode ver o título e a imagem ao mesmo tempo porque a imagem empurra o título da área visível; mas esse cenário não é genérico, a situação genérica é que título e imagem podem e aparecerão ao mesmo tempo.
holex
32

O Xcode-9 e o Xcode-10 da Apple fizeram algumas alterações em relação ao Edge Inset agora, você pode alterá-lo no inspetor de tamanho.

Siga os passos abaixo:

Etapa 1: insira o texto e selecione a imagem que deseja mostrar:

insira a descrição da imagem aqui

Etapa 2: selecione o controle de botão conforme sua exigência, como mostrado na imagem abaixo:

insira a descrição da imagem aqui

Etapa 3: Agora insira o tamanho do inspetor e agregue valor conforme sua exigência:

insira a descrição da imagem aqui

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

mas o código a seguir mostrará o rótulo acima e a imagem em segundo plano

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

Não há necessidade de usar o rótulo e o botão no mesmo controle porque o UIButton possui as propriedades UILabel e UIimageview.

Vinodh
fonte
1
Eu preciso para posicionar a imagem na parte superior e o texto abaixo da imagem ambos devem ser clicáveis ..
CODESEN
4

Use este código:

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];
Desenvolvedor iPhone
fonte
4

Use este código:

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]
Hemant Dixit
fonte
4

Encontrei o mesmo problema e o corrigi criando uma nova subclasse UIButtone substituindo o layoutSubviews:método como abaixo:

-(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 que a resposta de Angel García Olloqui é outra boa solução, se você as colocar manualmente no construtor de interfaces, mas manterei minha solução, pois não preciso modificar as inserções de conteúdo de cada botão.

Oyashiro
fonte
4

Faça UIImageViewe UILabele imagem Jogo e texto para ambos isso .... Em seguida, coloque um botão personalizado sobre imageView e Etiqueta ....

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];  
Rajneesh071
fonte
Simples e útil. Como definir a imagem e o título destacados?
precisa saber é o seguinte
para setHighlightedTextColor lable e você tem que jogar com forControlEvents
Rajneesh071
3

Você deve criar uma visualização de imagem personalizada para imagem e um rótulo personalizado para texto e adicionar ao seu botão como sub-visualizações. É isso aí.

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

Para fins de teste, use o yourButtonSelected:método

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

}

Eu acho que será útil para você.

Prasad G
fonte
3

É realmente simples, basta adicionar uma imagem ao plano de fundo do seu botão e fornecer um texto para o título do botão para obter um controle normal. É isso aí.

[btn setBackgroundImage:[UIImage imageNamed:@"img.png"] forState:UIControlStateNormal];
[btn setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
[btn setTitle:@"Click Me" forState:UIControlStateNormal];
Dhruv
fonte
4
... e como o texto fica embaixo da imagem?
holex
@holex: Muito obrigado por me orientar, encontrei uma falha nela e depois mudei de acordo.
Dhruv
1

versão rápida:

var button = UIButton()

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

insira a descrição da imagem aqui

aturan23
fonte