Não quero usar uma subvisão se puder evitá-la. Eu quero um UIButton
com uma imagem de fundo, texto e uma imagem nele. Agora, quando faço isso, a imagem está no lado esquerdo do texto. A imagem de fundo, o texto e a imagem têm diferentes estados de destaque.
ios
user-interface
layout
uibutton
jasongregori
fonte
fonte
Respostas:
Apesar de algumas das respostas sugeridas serem muito criativas e extremamente inteligentes, a solução mais simples é a seguinte:
Tão simples como isso. Como bônus, a imagem estará no lado esquerdo nos locais da direita para a esquerda.
EDIT : como a pergunta já foi feita algumas vezes, este é o iOS 9 + .
fonte
semanticContentAttribute
é apenas um hack / solução alternativa, não uma solução real.Solução mais simples:
iOS 10 e superior, Swift:
Antes do iOS 10, Swift / Obj-C:
fonte
button.ImageEdgeInsets = new UIEdgeInsets(0, -leftPadding, 0, leftPadding); button.ContentEdgeInsets = new UIEdgeInsets(0, 0, 0, leftPadding);
. Isso está no Xamarin, mas deve ser traduzido para Swift / Obj-C com bastante facilidade.Existe uma maneira mais fácil do Interface Builder .
Selecione o UIButton e selecione esta opção em Exibir utilitários> Semântica :
É isso aí! Agradável e simples!
Se você deseja ajustar o espaçamento entre a imagem e o título, pode alterar o Image Inset aqui:
Espero que ajude!
fonte
Subclassificar UIButton é completamente desnecessário. Em vez disso, você pode simplesmente definir um valor de inserção alto à esquerda para as inserções da imagem e uma pequena inserção à direita para o título. Algo assim:
fonte
Estou dando ao Inspire48 o crédito por este. Com base em sua sugestão e olhando para essa outra pergunta, eu vim com isso. Subclasse UIButton e substitua esses métodos.
fonte
buttonWithType
If you subclass UIButton, this method does not return an instance of your subclass. If you want to create an instance of a specific subclass, you must alloc/init the button directly
e asbackgroundRectForBounds
subclasses que fornecem adornos personalizados em segundo plano podem substituir esse método e retornar um retângulo de limites modificado para impedir que o botão desenhe sobre qualquer conteúdo personalizado. métodos, mas suponho que eles não se importam com subclasses.frame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(frame) - self.imageEdgeInsets.right + self.imageEdgeInsets.left - frame.origin.x;
Ele funciona melhor paraUIControlContentHorizontalAlignmentCenter
e outros ...Apenas atualize as inserções quando o título for alterado. Você precisa compensar a inserção com uma inserção igual e oposta do outro lado.
fonte
[thebutton.titleLabel sizeToFit];
antes. A largura pode ser zero se você não acionou um layout. O mesmo vale para o tamanho da imagem (é só usar o UIImage.size em vez do tamanho imageView)titleWidth = [self.titleLabel sizeThatFits:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height)].width;
(ou se você está preocupado com o quadro de botão ainda não sendo estabelecida, use CGFLOAT_MAX para a altura também) eimageWidth = self.currentImage.size.width;
layoutSubviews
na minhaUITableViewCell
subclasse, mas está funcionando bem. Obrigado!Todas essas respostas, em janeiro de 2016, são desnecessárias. No Construtor de interface, defina o modo de exibição semântica como
Force Right-to-Left
, ou se preferir a maneira programática,semanticContentAttribute = .forceRightToLeft
que fará com que a imagem apareça à direita do seu texto.fonte
UIBarButtonItem(customView: button)
, mas vai funcionar se você enrolar botão dentro de algum vista vaziaNo construtor de interface, você pode configurar as opções Edge Insets para UIButton, separadamente, com três partes: conteúdo, imagem, título
Xcode 8:
fonte
Atualização: Swift 3
Resposta original para Swift 2:
Uma solução que lida com todos os alinhamentos horizontais, com um exemplo de implementação Swift. Basta traduzir para Objective-C, se necessário.
Também vale a pena notar que ele lida muito bem com imagens e títulos.
Inspirado na resposta jasongregori;)
fonte
@IBDesignable
à classe e vê-la invertida no tempo de design.Se isso precisar ser feito em UIBarButtonItem , o agrupamento adicional na exibição deve ser usado.
Isso funcionará
Isso não vai funcionar
fonte
Aqui está a solução para o
UIButton
conteúdo alinhado ao centro. Este código alinha a imagem corretamente e permite o usoimageEdgeInsets
e otitleEdgeInsets
posicionamento precioso.Subclasse
UIButton
com sua classe personalizada e adicione:fonte
Como a solução de transformação não funciona no iOS 11, decidi escrever uma nova abordagem.
Ajustar os botões
semanticContentAttribute
nos dá a imagem perfeitamente à direita, sem precisar retransmitir se o texto mudar. Por esse motivo, é a solução ideal. No entanto, eu ainda preciso de suporte RTL. O fato de um aplicativo não poder alterar sua direção de layout na mesma sessão resolve esse problema facilmente.Com isso dito, é bastante direto.
fonte
Maneira da extensão
Usando a extensão para definir a imagem no lado direito com deslocamento personalizado
fonte
Swift - Estenda o UiButton e coloque estas linhas
fonte
Com base na solução elegante da Piotr Tomasik: se você quiser espaçar um pouco o rótulo e a imagem do botão , inclua isso nas bordas da seguinte forma (copie meu código aqui que funciona perfeitamente para mim):
Obrigado Piotr pela sua solução!
Erik
fonte
Faça você mesmo. Xcode10, swift4,
Para design de interface do usuário programaticamente
para design de interface do usuário do StoryBoard
fonte
Layout de subclassificação e substituição de subconjuntos é provavelmente o melhor caminho a percorrer.
Referenciado por: iPhone UIButton - posição da imagem
fonte
Tomou a resposta de @ Piotr e transformou-a em uma extensão Swift. Certifique-se de definir a imagem e o título antes de chamar isso, para que o botão seja dimensionado corretamente.
}
fonte
Uma opção rápida que faz o que você deseja sem brincar com inserções:
fonte
As soluções mencionadas aqui pararam de funcionar, depois que eu ativei o Layout automático . Eu tive que criar minha própria:
Subclasse UIButton e
layoutSubviews
método de substituição :Resultado:
fonte
solução de migração rápida 3.0 fornecida por jasongregori
fonte
Decidi não usar a visualização de imagem de botão padrão porque as soluções propostas para movê-la pareciam hacks. Isso me deu a estética desejada e é intuitivo reposicionar o botão alterando as restrições:
fonte
Swift 3:
fonte
E quanto a restrições? Ao contrário de semanticContentAttribute, eles não alteram a semântica. Algo assim talvez:
ou no Objetivo-C:
Advertências: não testado, iOS 9 ou superior
fonte
Para alinhar à direita a imagem no UIButton, tente o código abaixo
fonte
Depois de tentar várias soluções na Internet, eu não estava atingindo o requisito exato. Então acabei escrevendo o código do utilitário personalizado. Postagem para ajudar alguém no futuro. Testado no rápido 4.2
fonte
para esse problema, você pode criar o UIView dentro de "label with UIImage view" e definir a classe UIView como um UIControl e criar o IBAction de forma a aparecer ao lado
fonte
Swift 4 e 5
Alterar a direção da imagem UIButton (RTL e LTR)
fonte
Utility
?Xcode 11.4 Swift 5.2
Para quem tenta espelhar o estilo do botão Voltar com a divisa assim:
Implementação:
fonte
Acabei criando um botão personalizado, que permite definir a imagem do Inspector. Abaixo está o meu código:
Você pode ajustar o valor de Gap Padding no Inspector para ajustar o espaçamento entre o texto e a imagem.
PS: Utilizou parte do código da resposta de @Mark Hennings
fonte