пятница, 2 марта 2012 г.

How to load custom font from file (NSFont from file)

Load a NSFont from bundle.

First, add ApplicationServices.framework to project.

  1. + (CTFontRef) fontFromBundle : (NSString*) fontName withHeight : (CGFloat) height;  
  2. {  
  3.     // Get the path to our custom font and create a data provider.  
  4.     NSString* fontPath = [[NSBundle mainBundle] pathForResource : fontName
  5.                                                          ofType : @"ttf" ];   
  6.     if (nil==fontPath)  
  7.         return NULL;  
  8.       
  9.     CGDataProviderRef dataProvider =
  10.     CGDataProviderCreateWithFilename ([fontPath UTF8String]);  
  11.     if (NULL==dataProvider)  
  12.         return NULL;  
  13.       
  14.     // Create the font with the data provider, then release the data provider.  
  15.     CGFontRef fontRef = CGFontCreateWithDataProvider ( dataProvider );  
  16.     if ( NULL == fontRef )  
  17.     {  
  18.         CGDataProviderRelease ( dataProvider );   
  19.         return NULL;  
  20.     }      
  21.       
  22.     CTFontRef fontCore = CTFontCreateWithGraphicsFont(fontRef, height, NULL, NULL);  
  23.     CGDataProviderRelease (dataProvider);   
  24.     CGFontRelease(fontRef);  
  25.       
  26.     return fontCore;  
  27. }  

In code

  1. CTFontRef bundleFont = [ CustomFonts fontFromBundle : @"MavenPro-Regular"
  2.                                          withHeight : 25 ];  
  3. NSFont* font = (NSFont*)bundleFont;  
  4. ....  
  5. // use NSFont   
  6. ....  
  7. CFRelease(bundleFont);  
  8.    

UPD. works correctly only 10.7+