Ajustar o tamanho da fonte UIButton à largura

122

Eu tenho o seguinte código:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);

[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];

[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];

O problema é que, quando a sequência no texto não é longa, ela mostra boa (1-2 dígitos). No entanto, quando é bastante longo (3 dígitos), tudo o que vejo é um botão vermelho, sem texto dentro. Como ajusto isso?

Eu não acho isso:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

faz o trabalho, certo?

adit
fonte
Deveria funcionar, ou theLabel.adjustsFontSizeToFitWidth = YES.
Luke
Ele funciona através datitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Respostas:

291

Tente o seguinte:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE

Não sei por que isso faz o truque, mas faz :)

elibud
fonte
1
obrigado, enquanto button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE está depreciado agora
yunas
8
@yunas Substituir UILineBreakModeClip com NSLineBreakByClipping
CodeReaper
1
Nvm, isso acabou de mudar numberOfLinespara 0
Marty
34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

deve fazer o trabalho sozinho se você estiver usando o Layout automático e tiver definido uma restrição na largura do botão.

As outras opções (fator de escala mínimo, número de linhas etc.) ainda podem ser usadas para personalizar ainda mais de acordo com suas necessidades, mas não são necessárias.

joakim
fonte
15

A resposta do EliBud não funciona no iOS 8. Encontrei uma solução que funciona no iOS 8. Abaixo está um código rápido:

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)

Você pode brincar com o rótulo? .LineBreakMode, pois achei que os resultados variam para os diferentes modos de interrupção.

Alexander Belyavskiy
fonte
.adjustsFontSizeToFitWidth = true - como posso fazer o mesmo com um NSTextField e uma janela redimensionável?
Leo Dabus
Que olha para mim é como o mesmo que usando o Xcode IB selecionando rótulo e seting-la para escala de fonte mínimo Autoshrink para 0,01
Leo Dabus
não há opção AutoShrink ao usar o NSTextField
Leo Dabus
O UITextField tem uma opção para reduzir automaticamente o texto, enquanto o NSTextField não. Então eu acho que você precisa ajustar manualmente a fonte para ajustar a largura do campo de texto.
Alexander Belyavskiy
10

no mais recente rápido isso parece funcionar para mim

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping
tolbard
fonte
10

Solução iOS 10.3 com base nas outras respostas aqui:

    button.titleLabel!.numberOfLines = 1
    button.titleLabel!.adjustsFontSizeToFitWidth = true
    button.titleLabel!.baselineAdjustment = .alignCenters

Ninguém mencionou baselineAdjustmentainda; Eu precisava disso porque o rótulo do botão fica desalinhado verticalmente depois que adjustsFontSizeToFitWidthentra em vigor. baselineAdjustmentDocumentação da Apple :

Se a adjustsFontSizeToFitWidthpropriedade estiver configurada como true, essa propriedade controlará o comportamento das linhas de base do texto em situações em que é necessário o ajuste do tamanho da fonte. O valor padrão desta propriedade é alignBaselines. Esta propriedade é efetiva somente quando a numberOfLinespropriedade está configurada como 1.


FWIW, eu nunca consegui alinhar o rótulo perfeitamente.

Filhote
fonte
8

adjustsFontSizeToFitWidth não estava funcionando para mim até eu definir uma restrição de largura no meu botão no Interface Builder.

A definição da restrição impediu que o botão aumentasse de tamanho e, portanto, não percebeu que era necessário reduzir o texto.

kraftydevil
fonte
8

Extensão Swift 4

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters 
        }
    }
}

insira a descrição da imagem aqui

Nik Kov
fonte
para que você usa a tag?
Zaporozhchenko Oleksandr
Para estar disponível para fazer o getter
Nik Kov
Você pode descrever mais profundamente o que quer dizer, por favor?
Zaporozhchenko Oleksandr
Eu uso a tag como uma bandeira para definir se o ajuste está ativado.
22618 Nik Nikov
por que você apenas não usa self.titleLabel?. ajustaFontSizeToFitWidth? para que você precisa de algo extra?
Zaporozhchenko Oleksandr
3

Solução Xamarin.iOS

var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);            
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);

Acabei definindo o tamanho da fonte para garantir que ela fosse "grande" antes que o sistema ajuste o tamanho para caber.

ben
fonte
3

com base na resposta de Nik Kov:

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }
Zaporozhchenko Oleksandr
fonte
Isso funciona, mas o tamanho da fonte está diminuindo bastante, como de 17 para 12. Existe alguma maneira de aumentar a largura do rótulo de título quando a string é maior?
R. Mohan
@ R.Mohan certeza, mas isso tudo sobre largura fixa. Apenas faça restrições não corrigidas, e elas crescerão. Não defina ambos à frente / à direita, nem faça um deles> =
Zaporozhchenko Oleksandr
0

A solução abaixo funcionou para mim:

button.titleLabel?.adjustsFontForContentSizeCategory = true

A documentação do desenvolvedor explica essa propriedade como:

Um valor booleano que indica se o objeto atualiza automaticamente sua fonte quando a categoria de tamanho do conteúdo do dispositivo é alterada.

Vinayak
fonte
0

No iOS 13.1 com Swift 5, eu precisava fornecer contentEdgeInsetstambém para ajustar os preenchimentos.

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters
            self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        }
    }
}
Bharat
fonte