Como funciona o minimumScaleFactor de um UILabel?

109

Eu usei minimumFontSizeantes, mas essa função agora está obsoleta e não entendo muito bem como minimumScaleFactorfunciona.

Eu quero que o tamanho máximo da fonte seja 10 e o mínimo seja 7.

Como posso redimensionar para o tamanho da fonte 7 com o fator de escala?

UILabel criação:

UILabel *label = [[UILabel alloc] init];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
label.text =  [labelName uppercaseString];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.font = [UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:9.5];
label.backgroundColor = [UIColor clearColor];
label.minimumScaleFactor = .1f;

[label addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[label(WIDTH)]"
                                                              options:0
                                                              metrics:@{@"WIDTH" : [NSNumber numberWithFloat:buttonSize.width]}
                                                                views:NSDictionaryOfVariableBindings(label)]];

[contentView addSubview:label];
Padin215
fonte

Respostas:

204

Você precisa definir o label.adjustsFontSizeToFitWidth = YES;

Scott
fonte
1
Perfeito, isso é o que estava faltando em meu próprio código. Obrigado: D
Fogmeister
14
Nota: "A documentação da Apple diz que o minimumScaleFactor só funciona se numberOfLines for definido como 1. Usar 0 ou qualquer coisa maior que 1 não funcionará." . Obrigado SeanK.
samthui7
Impressionante! Engraçado que, se você definir minumScaleFactor no XIB, não precisará definir adjustsFontSizeToFitWidth, mas precisará ao fazer no código.
Politta,
104

Além do que dizem as outras respostas, se você colocar minSize / defaultSize (division) como o minimumScaleFactor, será o mesmo que usar o antigo minimumFontSize.

Por exemplo, se você deseja que o tamanho mínimo da fonte seja 10 usando o tamanho de etiqueta padrão, você pode fazer:

[label setMinimumScaleFactor:10.0/[UIFont labelFontSize]];

(Substitua [UIFont labelFontSize]pelo tamanho da fonte da etiqueta se não for o padrão).

que seria o mesmo que: [label setMinimumFontSize:10.0];

Jsdodgers
fonte
a divisão deve ser lançada como CGFloat, caso contrário não funcionaria
quase
@dwery Fazer 10 / labelSize pode terminar com um valor inteiro truncado de 0, mas 10.0 ou 10.f funcionam bem, sem conversão explícita.
Kalle
você está certo, deve funcionar. Não me lembro em qual código não funcionou para mim, provavelmente estava faltando o f ou o ponto.
Dwery
20

De acordo com a documentação :

Use esta propriedade para especificar o menor multiplicador para o tamanho da fonte atual que produz um tamanho de fonte aceitável para usar ao exibir o texto do rótulo. Se você especificar um valor de 0 para esta propriedade, o tamanho da fonte atual é usado como o menor tamanho de fonte.

Portanto, se o tamanho da fonte padrão para a sua etiqueta for 10, coloque 0.7fcomo um minimumScaleFactore ele deve fazer a mesma coisa que minimumFontSizefez.

kovpas
fonte
Isso é o que eu pensei também; mas mesmo quando coloco como 0.1f, o texto não ajusta o tamanho. vou adicionar o código uilabel.
Padin215 01 de
E se você remover as restrições e apenas reduzir a moldura do rótulo?
kovpas 01 de
9
Log139: Qual é o seu numberOfLines definido? A documentação da Apple diz que o minimumScaleFactor só funciona se numberOfLines for definido como 1. Usar 0 ou qualquer coisa maior que 1 não funcionará.
SeanK
1
@SeanK Funcionará mesmo se numberOfLines for definido como mais de 1, mas NÃO 0.
Asadullah Ali
12

Além de outras respostas, vou adicionar uma explicação amigável para iniciantes que me ajudou:

Como calcular um minimumScaleFactor? Divida o tamanho mínimo da fonte da etiqueta pelo tamanho da fonte padrão da etiqueta. Por exemplo, o tamanho da fonte padrão é 25. O tamanho mínimo da fonte é 10.

10/25 = 0,4

0,4 é o seu minimumScaleFactorvalor. Veja também a resposta de @Jsdodgers acima.

AVog
fonte