Então, eu não sei sobre você, mas trabalhar com fontes em Objective C no iOS é uma dor no final, especialmente se você estiver permitindo que o usuário selecione mais de uma fonte. (Digamos, um leitor de e-book.) Se você deseja obter o estilo negrito ou itálico de uma fonte, a maioria dos conselhos indica que você deve adicionar -Bold
ou -Italic
ao nome da fonte.
Por exemplo:
NSString *theFontName = @"...";
UIFont *theRegularFont = [UIFont fontWithName:theFontName size:20];
NSString *theBoldFontName = [theFontName stringByAppendingString: @"-Bold"];
UIFont *theBoldFont = [UIFont fontWithName:theBoldFontName size:20];
Isso funciona muito bem se sua fonte inicial for Helvetica
, porque há um correspondente Helvetica-Bold
. Mas e se a fonte precisar -Black
do estilo negrito? Ou pior, a fonte regular precisa ser especificada como -Roman
ou -Regular
(nesse caso, a fonte em negrito agora é -Roman-Bold
, o que provavelmente não existe).
Neste ponto, você tem um problema: theBoldFont
é nil
. O que significa que você pode fazer tudo o que quiser, mas visualmente o resultado não será o certo. (Se alguma coisa for exibida.)
Portanto, a abordagem ingênua seria apenas adicionar outra linha:
if (!theBoldFont) theBoldFont = theRegularFont;
O que o leva de volta a ser capaz de calcular e desenhar texto, mas não é negrito! (Claro, nem toda fonte tem um estilo negrito. Mas para aquelas que têm, seria bom usar o estilo negrito apropriado.)
Agora imagine que você precise suportar condicionalmente o itálico na fonte normal e em negrito. Ack! Agora você tem o mesmo problema para cada novo estilo e está apenas escrevendo código tentando contornar o problema, mas não resolvendo muito bem.
UIFont+Utility
para o resgate … ou pelo menos, para lhe poupar alguma dor. Vou mostrar a essência agora para que você possa dar uma olhada enquanto examinamos um pouco do que faz: https://gist.github.com/kerrishotts/5061352
Se você olhar o código, a maior coisa que você notará é que há uma grande matriz lá que mapeia nomes de fonte simples (como ) para seus nomes de fonte um pouco mais complicados que você pode usar com ( ). Mas há mais – para cada fonte, a matriz também indica o estilo regular, negrito, itálico e negrito + itálico. Então + se torna .Courier New
UIFont
CourierNewPSMT
Courier New
Bold
CourierNewPS-BoldMT
Agora, nem todas as fontes estão listadas nesta matriz – algumas por um motivo e outras simplesmente porque eu não as uso. Quando uma fonte possui apenas um estilo, não há necessidade de listá-la, pois o método retornará o nome da fonte original. Alternativamente, se uma fonte que você gosta de usar não está listada, você sempre pode adicioná-la à matriz (o que seria importante se você oferecer suporte a uma fonte personalizada).
Portanto, com essa categoria de utilitário, você pode fazer coisas muito legais, mas precisa ter em mente que o mapeamento não é 100% ortogonal. Ele tenta, mas sem construir uma matriz reversa, não vai ser perfeito.
Aqui estão alguns exemplos:
*UIFont aFont = [UIFont fontWithName:@"Courier New" andSize:20];
*UIFont bolded = aFont.boldFont;
*UIFont italicized = aFont.italicFont;
*UIFont both = aFont.boldItalicFont;
Se a fonte que o utilitário tenta usar não existir, ele retornará Helvetica
.
Você também pode fazer isso se quiser uma fonte alternativa específica:
*UIFont anotherFont = [UIFont fontWithName:@"Oddball" andSize:20 usingFallback: @"Georgia"];
Você também pode verificar se uma fonte está em itálico ou negrito:
isTheFontItalicized = aFont.isItalicized;
isTheFontBolded = aFont.isBolded;
Agora, se você quiser evitar o uso dos métodos de criação de fontes e quiser apenas o nome da fonte, poderá usar o seguinte:
NSString* aBoldFontName = [UIFont fontForFamilyName:@"Helvetica" withAttributes: PKFontBold];
Você também pode usar atributos “difusos”:
NSString* aBoldFontName = [UIFont fontForFamilyName:@"Helvetica Bold"];
Outra coisa que geralmente surge é a necessidade de aumentar ou diminuir o tamanho de uma fonte (digamos, para um título):
*UIFont textFont = [UIFont fontWithName:@"Helvetica" andSize:20];
*UIFont headingFont = [textFont fontWithSizeDelta:12];
*UIFont variantFont = [textFont fontWithSizeDeltaPercent:1.25];
O método adicionará o número ao tamanho da fonte original – portanto, se você usar um número negativo, diminuirá o tamanho da fonte retornada. O método permite dimensionar uma fonte em uma determinada quantidade; no exemplo acima, o tamanho da fonte é multiplicado por 1,25, que retorna 25.fontWithSizeDelta:
FontWithSizeDeltaPercent:
Agora, tudo isso é bom, mas cuidado – este é um código novo, o que significa que não fui capaz de testá-lo completamente. Faz o que preciso no momento, mas pode não satisfazer suas necessidades. Sem dúvida, bifurque-o se precisar fazer alterações (ou sugerir modificações de volta à essência original), mas apenas entenda que pode haver ocasiões em que ele não age da maneira que você espera.
Ah, e uma última coisa: o código é licenciado pelo MIT, então use como quiser.