2010-03-12 24 views
9

Questa è una domanda per principianti sulla gestione dei font in Cocoa. Ho una famiglia di caratteri, ad es. Verdana, che ha le seguenti caratteri: regolare, Bold, italica, e grassetto corsivo. So che questi caratteri tipografici esistono poiché sono disponibili nel pannello Caratteri.Come posso creare un NSFont sia grassetto che corsivo?

Questo funziona:

NSFont *regular = [NSFont fontWithName:@"Verdana" size:75]; 
NSFont *bold = [NSFont fontWithName:@"Verdana-Bold" size:75]; 
NSFont *italic = [NSFont fontWithName:@"Verdana-Italic" size:75]; 

Questo non funziona:

NSFont *boldItalic = [NSFont fontWithName:@"Verdana-Bold Italic" size:75]; 

Qual è il modo più semplice per ottenere la versione Bold Italic di una data famiglia di font?

risposta

21

Questo funziona:

NSFontManager *fontManager = [NSFontManager sharedFontManager]; 
NSFont *boldItalic = [fontManager fontWithFamily:@"Verdana" 
              traits:NSBoldFontMask|NSItalicFontMask 
              weight:0 
              size:75]; 
+1

mi scuso per t lui ovvio plug, ma volevo dire che ho realizzato il framework [CocoaPuffs] (http://github.com/macpgrog-guy/CocoaPuffs) disponibile su GitHub e contiene una bella categoria per lavorare con NSFont e NSFontManager. Ci sono anche alcuni dettagli [qui] (http: // macprog.com/semplificando-nsfont /). In questo caso specifico, se hai già un riferimento al font Verdana, tutto ciò che avresti dovuto fare è verdana.fontVariationBoldItalic. – aLevelOfIndirection

+0

@aLevelOfIndirection: i due collegamenti che ci hai fornito sono infranti. – Vince

+0

Scuse. Da allora ho eliminato il quadro. Ho aggiunto un [Gist] (https://gist.github.com/macprog-guy/156d33bfefef570a7efb) proprio ora con il codice per questo. Quindi vai avanti e scaricalo. – aLevelOfIndirection

6

Verdana-BoldItalic.

(Il vero nome della variante grassetto-corsivo del carattere dipende dalla famiglia, e alcuni di carattere non avere grassetto corsivo, utilizzare un NSFontDescriptor con -fontDescriptorWithSymbolicTraits: per ottenere l'esatto carattere corsivo grassetto.)

8

See NSFontManager e -convertFont: toHaveTrait:

Per informazioni più dettagliate, vi suggerisco la lettura del Font Handling Guide e in particolare la sezione intitolata Converting Fonts Manually.

Si noti che il font che si sta utilizzando deve avere qualche versione di esso con i tratti che si richiedono, altrimenti si otterrà un font, ma senza la caratteristica richiesta.

Se, alla fine, si sta cercando di aggiungere un tratto italico per un tipo di carattere che non dispone di uno, check out:

How do I get Lucida Grande italic into my application?

1

trovo le seguenti categorie UIFont estremamente utili:

@implementation UIFont (Styles) 
- (instancetype)bold 
{ 
    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:(self.fontDescriptor.symbolicTraits|UIFontDescriptorTraitBold)] size:self.pointSize]; 
} 

- (instancetype)italic 
{ 
    return [UIFont fontWithDescriptor:[self.fontDescriptor fontDescriptorWithSymbolicTraits:(self.fontDescriptor.symbolicTraits|UIFontDescriptorTraitItalic)] size:self.pointSize]; 
} 
@end 

Queste retue rn una versione in grassetto/corsivo di qualunque sia il tuo font esistente, usando UIFontDescriptorSymbolicTraits. Questo è un ottimo modo per cambiare, per esempio, il testo di una cella o detailText di essere grassetto o corsivo, o entrambi, semplicemente facendo:

cell.textLabel.font = cell.textLabel.font.bold; 
cell.detailTextLabel.font = cell.detailTextLabel.font.italic; 

Nota: il nuovo stile è in OR con eventuali tratti esistenti, in modo da poter aggravare gli stili per ottenere sia da:

cell.textLabel.font = cell.textLabel.font.bold.italic; 
+0

L'OP sta chiedendo di NSFont –

Problemi correlati