2011-02-09 85 views
14

我想允許我的應用程序用戶在應用程序中使用自己的字體,方法是將它們複製到Documents目錄(通過iTunes)中。但是,我找不到以這種方式使用自定義字體的方法,因爲正確的方式取決於在應用程序的Info.plist中使用UIAppFonts密鑰。iOS:在運行時以編程方式添加自定義字體

有什麼辦法可以在運行時覆蓋這個嗎?

謝謝。

回答

1

有一個由Zynga的傢伙創建的類,可以加載任何自定義字體:FontLabel

您必須在您的應用程序啓動時(例如在您的應用程序委託中)爲要在您的應用程序中使用的每種字體調用[FontManager loadFont:]

因此,在Documents文件夾中尋找.ttf文件(該庫僅與ttf字體一起使用)中進行迭代是不平凡的。

有一點要注意:這個類使用UILabel的子類。

+0

謝謝,這看起來相當有效的,但我希望一個更好的解決方案。畢竟我使用UITextView來顯示文本。 – Vicarius 2011-02-09 09:07:22

18

我知道這是一個老問題,但我今天想要做同樣的事情,並找到了使用CoreText和CGFont的方法。

首先要確保您添加CoreText框架和

#import <CoreText/CoreText.h> 

那麼這應該這樣做(在這個例子中,我使用我之前下載並保存到文檔目錄的fonts目錄中的字體):

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsDirectory = [paths objectAtIndex:0]; 
    NSString * fontPath = [documentsDirectory stringByAppendingPathComponent:@"Fonts/Chalkduster.ttf"]; 
    NSURL * url = [NSURL fileURLWithPath:fontPath]; 
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url); 
    CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider); 
    NSString * newFontName = (__bridge NSString *)CGFontCopyPostScriptName(newFont); 
    CGDataProviderRelease(fontDataProvider); 
    CFErrorRef error; 
    CTFontManagerRegisterGraphicsFont(newFont, &error); 
    CGFontRelease(newFont); 

    UIFont * finalFont = [UIFont fontWithName:newFontName size:20.0f]; 

希望它可以幫助任何人絆倒這個問題!

+0

我使用這種方法,謝謝 – 2013-03-27 09:22:44

6

試試這個

#import "MBProgressHUD.h" 
#import <CoreText/CoreText.h> 


- (void)viewDidLoad 
{ 
    NSURL *fileNameURL=[NSURL URLWithString:@"http://www.ge.tt/api/1/files/6d7jEnk/0/"]; 
    NSMutableURLRequest *filenameReq=[[NSMutableURLRequest alloc] initWithURL:fileNameURL]; 
    NSData *responseData=[NSURLConnection sendSynchronousRequest:filenameReq returningResponse:nil error:nil]; 

    NSDictionary* json = [NSJSONSerialization 
          JSONObjectWithData:responseData 
          options:kNilOptions 
          error:nil]; 


    NSString *fontFileName=[[[json valueForKey:@"filename"] componentsSeparatedByString:@"."] objectAtIndex:0]; 

    NSLog(@"file name is %@",fontFileName); 

    NSURL *url=[NSURL URLWithString:@"http://www.ge.tt/api/1/files/6d7jEnk/0/blob?download"]; 

    NSMutableURLRequest *request=[[NSMutableURLRequest alloc] initWithURL:url]; 

    __block NSError *error; 
    __block NSURLResponse *response; 

    MBProgressHUD *hud=[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    [email protected]"Changing Font.."; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

     NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

     NSString *rootPath=[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents"]]; 
     NSString *filePath=[rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.ttf",fontFileName]]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [MBProgressHUD hideAllHUDsForView:self.view animated:YES]; 

      NSFileManager *fm=[NSFileManager defaultManager]; 

      if (![fm fileExistsAtPath:filePath]) { 
       [urlData writeToFile:filePath atomically:YES]; 
      } 

      NSString *rootPath=[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents"]]; 
      NSString *filePath=[rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.ttf",fontFileName]]; 

      NSURL * fonturl = [NSURL fileURLWithPath:filePath]; 
      CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)fonturl); 

      CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider); 
      NSString * newFontName = (__bridge NSString *)CGFontCopyPostScriptName(newFont); 
      CGDataProviderRelease(fontDataProvider); 
      CFErrorRef fonterror; 
      CTFontManagerRegisterGraphicsFont(newFont, &fonterror); 

      CGFontRelease(newFont); 

      UIFont * finalFont = [UIFont fontWithName:newFontName size:20.0f]; 

      [txt_UserName setFont:finalFont]; 
     }); 
    }); 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

Sample Code Here

它看起來像

enter image description here

相關問題