Eu tenho alguns UIButtons e no IB eles estão configurados para Aspect Fit, mas por alguma razão eles estão sempre se alongando. Existe algo mais que você precisa definir? Tentei todos os modos de visualização diferentes e nenhum deles funcionou, todos eles se estendem.
ios
iphone
uibutton
aspect-fit
marty
fonte
fonte
Respostas:
Eu já tive esse problema antes. Eu resolvi isso colocando minha imagem em um
UIImageView
, onde ascontentMode
configurações realmente funcionam, e colocando um personalizado transparenteUIButton
em cima disso.EDIT: Esta resposta é obsoleta. Veja a resposta de @Werner Altewischer para a resposta correta nas versões modernas do iOS.
fonte
A solução é definir o
contentMode
naimageView
propriedade doUIButton
. OUIButton
deve ser criado com um tipo personalizado para que funcione, eu acredito (caso contrário,nil
é retornado para esta propriedade).fonte
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
Este método funcionou muito bem para mim .:
No Xib selecione o botão e defina
user defined runtime attributes
:self.imageView.contentMode
Number
1
fonte
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
funcionou para mim!Se estiver fazendo isso no Interface Builder, você pode usar o inspetor de atributos do Runtime para definir isso diretamente, sem qualquer código.
Defina o caminho da chave no botão como "imageView.contentMode" com um tipo de "Número" e um valor de "1" (ou qualquer modo que você desejar).
fonte
Use imageView do botão para contentMode. Não diretamente no próprio botão.
fonte
Se você colocar a imagem
UIImageView
atrás do botão, perderá a funcionalidade embutida daUIButton
classe, comoadjustsImageWhenHighlighted
e eadjustsImageWhenDisabled
, claro, a capacidade de definir imagens diferentes para estados diferentes (sem o embaraço de fazer isso sozinho).Se quisermos ter uma imagem não expandida para todos os estados de controle , uma abordagem é obter a imagem usando
imageWithCGImage:scale:orientation
, como no seguinte método:Para implementar isso, escreveríamos:
Isso deve evitar que a imagem se estique em todos os estados de controle. Funcionou para mim, mas deixe-me saber se não funcionar!
NOTA: Aqui estamos tratando de um problema relacionado a
UIButton
, masinsideButton:
pode muito bem serinsideView:
, ou qualquer outra coisa em que se gostaria de ajustar a imagem.fonte
Eu tive esse problema um tempo atrás. O problema que tive é que estava tentando aplicar esse efeito ao UIButton de fundo, o que é limitado e, portanto, significa que você não pode ajustá-lo tão facilmente.
O truque é configurá-lo apenas como uma imagem e então aplicar a técnica de @ayreguitar e isso deve consertar!
fonte
Isso funcionou para mim
Obrigado a @ayreguitar pelo seu comentário
fonte
Aqui está uma resposta alternativa rápida:
fonte
Combinando algumas respostas diferentes em uma solução - crie um botão com um tipo personalizado, defina a propriedade imageView contentMode do botão e defina a imagem para o botão (não a imagem de fundo, que ainda será dimensionada para preencher).
fonte
fonte
Esta resposta é baseada na resposta de @WernerAltewischer .
Para evitar conectar meu botão a um IBOutlet para executar o código nele, criei uma subclasse da classe UIButton:
Agora crie um botão personalizado em seu xib e defina sua imagem (não a imagem de fundo):
Em seguida, defina sua classe:
Você Terminou!
Ao invés de
aspecto da imagem do botão, o ajuste agora é o esperado:
fonte
ios 12. Você precisa adicionar também o Alinhamento de conteúdo
fonte
Tive problemas com a imagem não redimensionada proporcionalmente, então a maneira que eu consertei foi usando inserções de borda.
fonte
Os modos de conteúdo UIView se aplicam ao "conteúdo" do CALayer correspondente. Isso funciona para
UIImageView
s porque eles definem oCALayer
conteúdo como o correspondenteCGImage
.drawRect:
no final, renderiza para o conteúdo da camada.Um custom
UIButton
(até onde eu sei) não tem conteúdo (os botões de estilo de retângulo arredondado podem ser renderizados usando conteúdo). O botão tem subvisualizações: o plano de fundoUIImageView
, a imagemUIImageView
e o títuloUILabel
. Definir ocontentMode
nas subvisualizações pode fazer o que você quiser, mas mexer com aUIButton
hierarquia de visões é um pouco inconveniente.fonte
Mudar
UIButton.imageView.contentMode
não funcionou para mim.Resolvi o problema configurando a imagem para a propriedade 'Background'.
Você pode adicionar restrição de proporção se precisar
fonte
Isso se sobrepõe a muitas das outras respostas, mas a solução para mim foi
contentMode
doUIImageView
para o botão para.ScaleAspectFit
- o que pode ser feito em "Atributos de tempo de execução definidos pelo usuário" no Construtor de interface (ou sejaself.imageView.contentMode
, número, 1) ou em umUIButton
subclasse;fonte
Você pode usar imageWithCGImage conforme mostrado acima (mas sem os parênteses ausentes).
Além disso ... milhões de telefones diferentes do 4.0 não funcionarão com esse código.
fonte
[button sizeToFit]
trabalhou para mim.fonte
Semelhante a @Guillaume, criei uma subclasse de UIButton como um arquivo Swift. Em seguida, defina minha classe personalizada no Interface Builder:
.
E aqui está o arquivo Swift:
fonte
Eu tive o mesmo problema, mas não consegui fazer funcionar (talvez seja um bug com o SDK).
Eventualmente, como uma solução alternativa, coloquei um
UIImageView
atrás do meu botão e defini as opções que eu queriaUIButton
nele , então simplesmente coloquei um espaço em branco em cima dele.fonte