2013-04-15 15 views
25

Se ho un oggetto UIFont, è possibile convertirlo in grassetto? Non conosco il nome del font, ho solo un oggetto UIFont. Quello che voglio è una funzione comeCome posso creare un UIFont in grassetto da un UIFont regolare?

UIFont *boldFontFromFont(UIFont *input) 
{ 
    return [input derivedFontWithFontWeight:UIFontWeightBold]; 
} 

Come posso modificare il codice in modo che funzioni. (Il codice sopra non funziona, l'ho appena inventato per illustrare il punto.)

Grazie in anticipo.

risposta

11

Per ottenere un carattere in grassetto è necessario passare un nome specifico del carattere da una famiglia di caratteri. È possibile ottenere un nome di famiglia di font da un determinato font, quindi elencare tutti i font di questa famiglia. In generale, un font in grassetto conterrà "bold" nel suo nome, ma il formato non è rigoroso e potrebbero esserci varianti come "Helvetica-BoldOblique", ad esempio. Si può partire da questo codice:

- (UIFont *)boldFontFromFont:(UIFont *)font 
{ 
    NSString *familyName = [font familyName]; 
    NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName]; 
    for (NSString *fontName in fontNames) 
    { 
     if ([fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound) 
     { 
      UIFont *boldFont = [UIFont fontWithName:fontName size:font.pointSize]; 
      return boldFont; 
     } 
    } 
    return nil; 
} 
+0

hmm, c'è un problema: per il systemFont, hai familyName == ".Helvetica NeueUI" e l'array fontNames è un array vuoto: -/ – Michael

+1

@Michael ho provato 'UIFont * boldFont = [self boldFontFromFont : [UIFont systemFontOfSize: 12.0]]; '. L'output di NSLog è: ' font-family:" Helvetica-BoldOblique "; font-weight: bold; stile di carattere: corsivo; font-size: 12px' – filwag

+0

ok, hai usato ios6? perché io uso ios 5. forse il sistema dei caratteri è cambiato in ios6? – Michael

2

è possibile utilizzare

[UIFont boldSystemFontOfSize:12]. 

Se si utilizzano font personalizzati è necessario utilizzare il nome direttamente

[UIFont fontWithName:@"Helvetica-Bold" size:17.0]. 

È possibile cercare il possibili nomi di font con

[UIFont fontNamesForFamilyName:@"American Typewriter"]. 

In questo messaggio: https://stackoverflow.com/a/15388946/436818 Ben M ha un'idea di come ottenere la versione in grassetto in modo dinamico. Ma estendi il metodo per essere sicuro di ottenere la versione in grassetto (se esiste) perché ci sono altre versioni in grassetto come CondensedBold.

77

iOS 7 introduce una nuova UIFontDescriptor classe, che lo rende molto più facile:

UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:12]; 
NSLog(@"plain font: %@", font.fontName); // “HelveticaNeue” 

UIFont *boldFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] size:font.pointSize]; 
NSLog(@"bold version: %@", boldFont.fontName); // “HelveticaNeue-Bold” 

UIFont *italicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic] size:font.pointSize]; 
NSLog(@"italic version: %@", italicFont.fontName); // “HelveticaNeue-Italic” 

UIFont *boldItalicFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic] size:font.pointSize]; 
NSLog(@"bold & italic version: %@", boldItalicFont.fontName); // “HelveticaNeue-BoldItalic” 

Per le persone che si sono qui in cerca di un cacao (OS/X) equivalente, UIFontDescriptor viene da NSFontDescriptor, disponibile dal 10.3 .

+0

....... nice :) – Michael

+0

non funziona con ArialMT per me – ChikabuZ

5

Il tentativo di derivare il carattere grassetto/corsivo utilizzando il font oi nomi di famiglia non funziona più correttamente da iOS 7, a causa del nome famiglia di font criptico del font di sistema. Di seguito è una semplice estensione per derivare il carattere grassetto/corsivo utilizzando la classe UIFontDescriptor.

+(UIFont *) font:(UIFont *)font bold:(BOOL)bold italic:(BOOL)italic 
{ 
    NSUInteger traits = 0; 
    if (bold) 
    { 
     traits |= UIFontDescriptorTraitBold; 
    } 
    if (italic) 
    { 
     traits |= UIFontDescriptorTraitItalic; 
    } 
    return [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:traits] size:font.pointSize]; 
} 
14

E se siete alla ricerca per l'rapida attuazione:

let normalFont = UIFont(name: "FONT_NAME", size: CGFloat(20))! 
let boldFont = UIFont(descriptor: normalFont.fontDescriptor.withSymbolicTraits(.traitBold)!, size: normalFont.pointSize) 

Spero che questo aiuti! Saluti!

Problemi correlati