Estou tentando criar um botão que tenha algum texto abaixo do ícone (como os botões do aplicativo), no entanto, parece ser bastante difícil de alcançar. Alguma idéia de como posso obter o texto a ser exibido abaixo da imagem com a UIButton
?
158
https://github.com/albert-zhang/AZCenterLabelButton
( Link )Respostas:
Ou você pode apenas usar esta categoria:
ObjC
Extensão rápida
Sugestão: Se a altura do botão for menor que
totalHeight
, a imagem traçará bordas externas.imageEdgeInset.top
deveria estar:fonte
CGRectGetHeight()
eCGRectGetWidth()
ao obter a altura e largura do imageView e titleLabel.CGFloat inset = (self.frame.size.height - totalHeight)/2; self.contentEdgeInsets = UIEdgeInsetsMake(inset, 0.0f, inset, 0.0f);
No Xcode, você pode simplesmente definir o Título da borda esquerdo inserido como negativo na largura da imagem. Isso exibirá a etiqueta no centro da imagem.
Para que o rótulo seja exibido abaixo da imagem (como os botões do aplicativo), pode ser necessário definir a Inserção superior do título da borda como um número positivo.
fonte
Este é um botão de título centralizado simples implementado no Swift, substituindo
titleRect(forContentRect:)
eimageRect(forContentRect:)
. Também é implementadointrinsicContentSize
para uso com o AutoLayout.fonte
Veja esta ótima resposta em Swift.
fonte
left
emimageEdgeInsets
com(self.frame.size.width - imageSize.width) / 2
layoutSubviews()
sua superview.Subclasse
UIButton
. Substituir -layoutSubviews
para mover o built-insubviews
para novas posições:fonte
titleRectForContentRect
eimageRectForContentRect
Resposta refecored icecrystal23.
O Swift 3, funciona com layouts automáticos, xib, storyboards, pode ser animado.
O botão na resposta original do icecrystal23 tinha um quadro mal calculado. Eu acho que consertei isso.
Edit: Atualizado para o Swift 5 e realizado dentro do Interface Builder / Storyboards
fonte
corrigiu uma das respostas aqui:
Swift 3:
fonte
Esta é uma versão modificada da excelente resposta de Erik W. Mas, em vez de colocar a imagem centralizada na parte superior da visualização, ela coloca a imagem e o rótulo centralizados na visualização como um grupo.
A diferença é:
vs
Fonte abaixo:
FYI: Isso pode ser interrompido quando combinado com as animações do UIView, como layoutSubviews é chamado durante elas.
fonte
A solução de Dave em Swift:
fonte
Se você subclasse
UIButton
eoverride layoutSubviews
, poderá usar o abaixo para centralizar a imagem e colocar o título centralizado abaixo dela:kTextTopPadding
é uma constante que você precisará introduzir que determina o espaço entre a imagem e o texto abaixo dela.fonte
Atualização da resposta de Kenny Winker, pois sizeWithFont foi preterido no iOS 7.
fonte
No iOS 11 / Swift 4, nenhuma das respostas acima realmente funcionou para mim. Encontrei alguns exemplos e coloquei meu giro:
Espero que isso ajude alguém.
fonte
Usando o código de Kenny Winker e simeon, faço esse código rápido que funciona para mim.
fonte
Você só precisa ajustar as três inserções de borda com base no tamanho da imagem e no rótulo do título:
Você pode obter os limites do rótulo do título chamando sizeToFit após definir o texto. O espaçamento horizontal deve funcionar independentemente do tamanho do texto, fonte e imagem, mas não conheço uma solução única para manter consistente o espaçamento vertical e a borda do conteúdo inferior.
fonte
Aqui está a resposta de "Bear With Me" como uma subclasse em
Swift 2.0
. Para usá-lo, basta alterar sua classe de botãoInterface Builder
paraVerticalButton
e ele atualizará magicamente a visualização.Também o atualizei para calcular o tamanho correto do conteúdo intrínseco para o autolayout.
fonte
layoutSubviews()
é chamado repetidamente no meu caso:intrinsicContentSize
acessosimageView
que torna alayoutSubviews
ser chamado de que acessosimageView
etc.@Tiago Eu mudo sua resposta assim. Funciona bem com todos os tamanhos
fonte
Peguei uma combinação das respostas aqui e criei uma que parece estar funcionando para mim, em Swift. Eu não amo como acabei de substituir as inserções, mas funciona. Eu estaria aberto a melhorias sugeridas nos comentários. Parece funcionar corretamente com
sizeToFit()
e com layout automático.fonte
Use estes dois métodos:
Exemplo:
E você pode usar:
fonte
Swift 5 - o método abaixo funciona para mim
Verifique se o título do botão não está truncado no storyboard / xib, senão vá para a
Solução 2
fonte
Achei que a resposta de Simeon era provavelmente a melhor, mas estava me dando resultados estranhos em alguns botões e eu simplesmente não conseguia entender o porquê. Então, usando sua resposta como base, implementei meus botões conforme abaixo:
fonte
Aqui está minha subclasse da
UIButton
qual resolve esse problema:É isso aí. Funciona como charme. O problema pode aparecer se o botão for pequeno demais para caber no título e no texto.
fonte
Eu acho que uma das melhores maneiras de fazer isso é subclassificar UIButton e substituir alguns métodos de renderização:
fonte
solução do @ simeon em Objective-C
fonte
CGSizeMake(MAX(labelSize.width, image.size.width), image.size.height + labelSize.height + 5.0)
no caso se-Se você estiver usando fontes personalizadas, o cálculo para o tamanho do titleLabel não funcionará corretamente, substitua-o por
let titleLabelSize = self.titleLabel?.text?.size(withAttributes: [NSAttributedStringKey.font: self.titleLabel!.font!])
fonte
Em vez de passar pelo inferno tentando posicionar o ícone e o texto com bordas, você pode criar um NSAttributedString com sua imagem como anexo e configurá-lo para o título atribuído ao botão:
fonte
UIButton
layouts de campo de texto de A exibem apenas 1 linha; portanto, ele não funciona mesmo ao usar uma quebra de linha na sequência atribuída. Caso contrário, seria uma boa solução.button.titleLabel?.numberOfLines
a fim de obter o número necessário de linhasSolução amigável para localização:
Tantas ótimas soluções, pessoal, mas gostaria de adicionar uma nota aqui para quem usa a localização.
Você precisa reverter os valores EdgeInstets esquerdo e direito para obter o botão corretamente disposto em caso de alteração da direção do idioma de LtR para RtL.
Usando uma solução semelhante, eu a implementaria da seguinte maneira:
fonte
Imagem superior e botão de título inferior com subclasse UIButton
fonte
Definitivamente, isso é um exagero para esta pergunta ... Em um dos meus projetos, primeiro tive que implementar um botão com o ícone alinhado à esquerda. Então nós temos outro botão com o título abaixo da imagem. Procurei uma solução existente, mas sem sorte Então, aqui está o botão alinhado:
Espero que você ache útil.
fonte
Algo assim dentro da
UIButton
subclassefonte
É bem simples.
Em vez disso:
Usa isto:
Em seguida, você pode adicionar texto ao botão facilmente usando:
// button.titleLabel! .font = UIFont (nome: "FontName", tamanho: 30)
fonte