UIFont + Utility

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 -Boldou -Italicao 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 -Blackdo estilo negrito? Ou pior, a fonte regular precisa ser especificada como -Romanou -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+Utilitypara 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 NewUIFontCourierNewPSMTCourier NewBoldCourierNewPS-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.