Se eu tiver um UIButton organizado usando o autolayout, seu tamanho será ajustado para caber em seu conteúdo.
Se eu definir uma imagem como button.image
, o tamanho do instrinsic novamente parece explicar isso.
No entanto, se eu ajustar o titleEdgeInsets
botão, o layout não será responsável por isso e truncará o título do botão.
Como garantir que a largura intrínseca do botão seja responsável pela inserção?
Editar:
Estou usando o seguinte:
[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
O objetivo é adicionar alguma separação entre a imagem e o texto.
ios
cocoa-touch
uiview
uibutton
autolayout
Ben Packard
fonte
fonte
titleEdgeInset
documentação:The insets you specify are applied to the title rectangle after that rectangle has been sized to fit the button’s text. Thus, positive inset values may actually clip the title text.
Então, adicionando inserção você está forçando o botão para cortar o texto, com certezaRespostas:
Você pode resolver isso sem precisar substituir nenhum método ou definir uma restrição de largura arbitrária. Você pode fazer tudo isso no Interface Builder da seguinte maneira.
A largura intrínseca do botão é derivada da largura do título mais da largura do ícone e das inserções de borda de conteúdo esquerda e direita .
Se um botão tiver uma imagem e um texto, eles serão centralizados como um grupo, sem preenchimento entre eles.
Se você adicionar um conteúdo à esquerda, ele será calculado em relação ao texto, não ao texto + ícone.
Se você definir uma imagem negativa esquerda inserida, a imagem será puxada para a esquerda, mas a largura total do botão não será afetada.
Se você definir uma imagem esquerda negativa inserida, o layout real utilizará metade desse valor. Portanto, para obter uma inserção esquerda de -20 pontos, você deve usar um valor de inserção esquerda de -40 pontos no Interface Builder.
Portanto, você fornece uma inserção de conteúdo esquerda grande o suficiente para criar espaço para a inserção esquerda desejada e o preenchimento interno entre o ícone e o texto e, em seguida, muda o ícone para a esquerda dobrando a quantidade de preenchimento desejada entre o ícone e o texto. O resultado é um botão com inserções de conteúdo iguais à esquerda e à direita e um par de texto e ícone centralizado como um grupo, com uma quantidade específica de preenchimento entre eles.
Alguns exemplos de valores:
fonte
UIButton
.Você pode fazer isso funcionar no Interface Builder (sem escrever nenhum código), usando uma combinação de títulos e inserções de conteúdo negativos e positivos.
Atualização : O Xcode 7 possui um erro no qual você não pode inserir valores negativos no
Right
campo Inset, mas pode usar o controle stepper ao lado para diminuir o valor. (Obrigado Stuart)Isso adicionará 8 pontos de espaçamento entre a imagem e o título e aumentará a largura intrínseca do botão na mesma quantidade. Como isso:
fonte
Right
campo.Por que não substituir o
intrinsicContentSize
método no UIView? Por exemplo:Isso deve informar ao sistema de pagamento automático que deve aumentar o tamanho do botão para permitir inserções e mostrar o texto completo. Não estou no meu próprio computador, então não testei isso.
fonte
intrinsicContentSize
é um método no UIView, não no UIButton, portanto você não estaria mexendo em nenhum método UIButton. A Apple não acredita que seja um problema: "A substituição deste método permite que uma exibição personalizada comunique ao sistema de layout qual tamanho ele gostaria de basear em seu conteúdo". E o OP não disse nada sobre botões diferentes, apenas um.intrinsicContentSize
é de fato um método no UIView e UIButton é uma subclasse do UIView; portanto, é possível substituir esse método; nada nos documentos da Apple diz que você não deveria. Basta criar uma subclasse UIButton usando o método substituído de Maarten e alterar seu UIButton no Interface Builder para ser do tipo YourUIButtonSubclass e ele funcionará perfeitamente.intrinsicContentSize
que o UIButton deve adicionar o títuloEdgeInsets, vou arquivar um bug na Apple.Você não especificou como está definindo as inserções, portanto, acho que você está usando titleEdgeInsets porque vejo o mesmo efeito que você está obtendo. Se eu usar contentEdgeInsets, ele funcionará corretamente.
fonte
E para Swift trabalhou isso:
Love U Swift
fonte
Esse tópico é um pouco antigo, mas eu mesmo me deparei com isso e fui capaz de resolvê-lo usando uma inserção negativa. Por exemplo, substitua os valores de preenchimento desejados aqui:
Combinado com as restrições corretas de autolayout, você acaba com um botão de redimensionamento automático que contém uma imagem e texto! Visto abaixo com o
desiredLeftPadding
conjunto para 10.Você pode ver que o quadro real do botão não abrange o rótulo (já que o rótulo é deslocado 10 pontos para a direita, fora dos limites), mas alcançamos 10 pontos de preenchimento entre o texto e a imagem.
fonte
Para o Swift 3, com base na resposta do pegpeg :
fonte
Tudo acima não funcionou para o iOS 9+ , o que fiz foi:
Agora, para adicionar uma borda ao redor do botão, basta usar o método:
fonte
Eu queria adicionar um espaço de 5 pontos entre o ícone do UIButton e o rótulo. Foi assim que consegui:
A maneira como contentEdgeInsets, titleEdgeInsets e imageEdgeInsets se relacionam requer um pouco de troca de informações. Portanto, se você adicionar algumas inserções à esquerda do título, precisará adicionar uma inserção negativa à direita e fornecer mais espaço (via inserção positiva) no conteúdo à direita.
Ao adicionar uma inserção de conteúdo correta para corresponder à mudança das inserções de título, meu texto não sai dos limites do botão.
fonte
A opção também está disponível no construtor de interface. Veja o Inset. Coloquei esquerda e direita em 3. Funciona como um encanto.
fonte
A solução que eu uso é adicionar uma restrição de largura no botão. Em algum momento da inicialização, após a definição do texto, atualize a restrição de largura da seguinte maneira:
self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;
Onde 8 é a sua inserção.
fonte
constant
a restrição para o novo valor ... e saber quando é difícil o tamanho do conteúdo intrínseco do botão sem subclassificar o botão.setNeedsUpdateConstraints
pode ser "manualmente" após a atualização do título ou da imagem do botão. Você pode substituirupdateConstraints
e recalcularbuttonWidthConstraint
a constante a partir daí. Esta não é necessariamente a melhor abordagem, mas funciona bem o suficiente para mim. YMMV;)chamar sizeToFit () garante que contentEdgeInset seja efetivado
fonte