ios - type - objc custom font




我可以在iPhone應用程序中嵌入自定義字體嗎? (20)

Swift, code way: (works also with swift 2.0)

Add the required fonts to your project (just like adding images, just drag to Xcode), make sure that they are targeted to your project
add this method and load custom fonts (recommended in appDelegate didFinishLaunchingWithOptions )

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

    let dataProvider = CGDataProviderCreateWithCFData(fontData)
    let cgFont = CGFontCreateWithDataProvider(dataProvider)!

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

Use example:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Use the font:

UIFont(name: "My-Font", size: 16.5)

這個問題涉及iOS 3.2之前的版本。 從3.2開始,使用samvermette的答案很容易實現此功能,並且我已將接受的答案(從命令改為samvermette)反映出來。 我不能讚揚這兩個答案(除了upvotes),但他們都很好。

我希望有一個應用程序包含用於呈現文本的自定義字體,加載它,然後將其與標準UIKit元素(如UILabel 。 這可能嗎?

我發現下面的鏈接:

但是這些都需要我自己渲染每個字形,這有點像辛勤工作,特別是對於多行文本。

我還發現一些文章說明這是不可能的,但沒有理由,所以我正在尋找一個明確的答案。

編輯 - 失敗-[UIFont fontWithName:size:]實驗

我下載了Harrowprint.tff(從here下載)並將其添加到我的資源目錄和項目中。 然後我嘗試了這段代碼:

UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20];

導致拋出異常。 查看Finder中的TTF文件,確認字體名稱為Harrowprint。

編輯 - 到目前為止,已經有了很多回复,這些回復告訴我要閱讀X或Y上的文檔。我對這些內容進行了廣泛的實驗,並沒有得到任何答案。 在一個案例中,X被證明僅適用於OS X,而不是iPhone。 因此,我為這個問題設置了獎勵,並且我將獎勵給第一個提供答案的人(僅使用記錄的API),他們以足夠的信息做出響應,以便在設備上正常工作。 在模擬器上工作也是一個好處。

編輯 - 看來,賞金自動獎勵的答案與最高票數。 有趣。 沒有人真正提供了解決問題的答案 - 問題涉及編碼自己的UILabel子類的解決方案不支持自動換行,這對我來說是一個基本功能 - 儘管我想我可以擴展它來做到這一點。


iOS 3.2和更高版本支持這一點。 直接從iPhone OS 3.2 doc 的新功能

自定義字體支持
想要使用自定義字體的應用程序現在可以在應用程序包中包含這些字體,並通過在Info.plist文件中包含UIAppFonts鍵將這些字體註冊到系統中。 這個鍵的值是一串字符串,標識應用程序包中的字體文件。 系統看到密鑰時,會加載指定的字體並使其可供應用程序使用。

一旦在Info.plist設置了字體,您可以使用自定義字體作為IB中的任何其他字體或以編程方式使用。

Apple開發者論壇上有一個正在進行的討論:
https://devforums.apple.com/thread/37824 (需要登錄)

這裡有一個很好的簡單的3步教程,介紹如何實現這一點(斷開的鏈接刪除)

  1. 將您的自定義字體文件添加到使用Xcode作為資源的項目中
  2. 向您的Info.plist文件中添加一個名為UIAppFonts
  3. 將此鍵設為數組
  4. 對於每種字體,請輸入字體文件的全名(包括擴展名)作為UIAppFonts陣列的項目
  5. 保存Info.plist
  6. 現在在你的應用程序中,你可以簡單地調用[UIFont fontWithName:@"CustomFontName" size:12]來獲得與你的UILabelsUITextView等一起使用的自定義字體。

另外:確保字體在你的拷貝包資源中。


編輯:這個答案從iOS3.2開始已經失效; 使用UIAppFonts

我能夠成功加載自定義UIFont的唯一方法是通過私有GraphicsServices框架。

以下將加載應用程序主包中的所有.ttf字體:

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

一旦加載字體,就可以像蘋果提供的字體一樣使用它們:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices甚至可以在運行時加載,以防將來API消失:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}

Although some of the answers above are correct, I have written a detailed visual tutorial for people still having problems with fonts.

The solutions above which tell you to add the font to the plist and use

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

are the correct ones. Please do now use any other hackish way. If you are still facing problems with finding font names and adding them, here is the tutorial -

Using custom fonts in ios application


One-liner for Swift 3+ for printing out all font names:

UIFont.familyNames.forEach { print(UIFont.fontNames(forFamilyName: $0)) }

You can add the required "FONT" files within the resources folder. Then go to the Project Info.plist file and use the KEY "Fonts provided by the application" and value as "FONT NAME".

Then you can call the method [UIFont fontwithName:@"FONT NAME" size:12];


一個重要的注意事項:您應該使用與該字體關聯的“PostScript名稱”,而不是其全名或家族名稱。 該名稱通常可能與字體的正常名稱不同。


也許作者忘了給這個字體一個Mac FOND的名字

  1. FontForge打開字體,然後轉到元素>字體信息
  2. 有一個“Mac”選項,您可以在其中設置FOND名稱。
  3. 在File> Export Font下,您可以創建一個新的ttf

您也可以嘗試在導出對話框中輸入“Apple”選項。

免責聲明 :我不是iPhone開發者!


借助iOS 8 +和Xcode 6 +,您可以輕鬆完成此任務。 這裡是步驟:

1)將您的字體拖放到Xcode Supporting Files文件夾。 不要忘記在“ 添加到目標”部分標記您的應用。 從這一刻起,您可以在IB使用該字體,並從字體托盤中選擇它。

2)要使您的設備可以使用此字體,請打開您的info.plist並添加Fonts provided by application密鑰Fonts provided by application 。 它將包含項目0鍵,您必須添加您的字體名稱作為值。 字體名稱可能因您的字體文件名而異。 但首先,嘗試在大多數情況下添加您的文件名這項工作。

如果沒有, 這篇文章總是幫助我。

以下是本文代碼的一小段代碼,可幫助您找到您的字體名稱。

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

編輯

我想提一提,您需要將字體文件添加到您的目標的構建階段複製包資源 。 沒有它,你將無法在設備上看到你的字體。 這可能會導致意想不到的行為。

例如,我遇到一個bug ,當UITextField有自定義字體時,但這個字體不在復制包資源中 。 當我用這個textfield繼續到viewcontroller textfield ,在調用viewDidLoad函數之前大約4秒鐘有一個延遲。 解決字體問題消除了這種延遲。 所以,建議檢查兩次。 (rdar:// 20028250)順便說一下,我無法重現該錯誤,但我確信問題出在了字體上。


在Info.plist中添加條目“由應用程序提供的字體”,並將字體名稱包含為字符串:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

然後檢查以確保您的字體包含在運行中:

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
         NSLog(@"%@", fontName);
    }
}

請注意,您的ttf文件名稱可能與您為標籤設置字體時使用的名稱不同(您可以使用上面的代碼獲取“fontWithName”參數):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];

在現有的iOS應用程序中添加新字體非常簡單。

你只需要將字體例如font.ttf添加到你的資源文件夾中。

打開你的應用程序info.plist 。 將一個新行添加為“應用程序提供的字體”,並將字體名稱輸入為font.ttf。

而當設置字體做為setFont:"corresponding Font Name"

您可以通過NSArray *check = [UIFont familyNames];檢查您的字體是否被添加NSArray *check = [UIFont familyNames];

它將返回應用程序支持的所有字體。


如果您使用的是xcode 4.3 ,則必須在線程Custom Fonts Xcode 4.3中根據https://.com/users/1292829/arne將該font添加到Copy Bundle Resources下的Build Phase 。 這對我有效,下面是我為自定義字體在我的應用中工作的步驟:

  1. 將字體添加到您的項目。 我將OTF (或TTF )文件拖放到我創建的新組中,並接受xcode copying the files over to the project folder
  2. 創建UIAppFonts陣列,並將您的字體列為陣列中的項目。 只是names ,而不是擴展名(例如“ GothamBold ”,“ GothamBold-Italic ”)。
  3. 點擊屏幕左側Project Navigator頂部的project name方式。
  4. 點擊xcode主區域中的Build Phases選項卡。
  5. 展開“ Copy Bundle Resources ”部分並點擊"+"添加字體。
  6. 從點擊"+"時彈出的文件導航器中選擇字體文件。
  7. 為每個你必須add to the project字體執行此操作。

對於iOS 3.2及更高版本:使用以上幾種方法提供的方法:

  1. 將您的字體文件(例如Chalkduster.ttf )添加到XCode中項目的Resources文件夾中。
  2. 打開info.plist並添加一個名為UIAppFonts的新密鑰。 這個鍵的類型應該是數組。
  3. 將您的自定義字體名稱添加到此數組中,包括擴展名(“ Chalkduster.ttf ”)。
  4. 在應用程序中使用[UIFont fontWithName:@"Real Font Name" size:16]

但是 “真正的字體名稱”並不總是你在Fontbook中看到的。 最好的方法是詢問你的設備看到的字體和確切的名字。

我使用uifont-name-grabber發布的uifont-name-grabber

只需將所需的字體放入xcode項目中,將文件名添加到plist中,然後在您正在構建的設備上運行它,它將使用UIFont fontWithName:期望的名稱向您發送完整字體列表。


從iOS 4.1開始,有一種使用自定義字體的新方法。 它允許您動態加載字體,無論是來自應用程序中包含的文件,下載的數據還是您擁有的字體。 它還允許您在需要時加載字體,而舊方法在應用程序啟動時加載它們,如果您有許多字體,則該方法可能需要很長時間。

新方法在ios-dynamic-font-loading

您使用CTFontManagerRegisterGraphicsFont函數,為您的字體數據提供一個緩衝區。 然後,就像舊方法一樣,它可用於UIFont和Web視圖。 以下是該鏈接的示例代碼:

NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

我做了這樣的事情:

加載字體:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

現在,在你的drawRect: ,做這樣的事情:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

基本上你必須在文本中做一些強力循環,然後使用幻數來找出字體中的偏移量(這裡,請參閱使用29),但它可以工作。

此外,你必須確保字體在法律上是可嵌入的。 大多數不是,也有專門從事這類事情的律師,所以要警告。


我已經將這個頁面上的一些建議合併到了適用於iOS 5的某些內容中。

首先,您必須將自定義字體添加到您的項目中。 然後,您需要遵循@iPhoneDev的建議並將該字體添加到您的info.plist文件中。

你這樣做後,這個工作:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

但是,您需要知道字體的Postscript名稱。 只要按照@丹尼爾伍德的建議,並在FontBook中按下命令即可。

然後,享受您的自定義字體。


按照這一步

1)在你的項目中復制你的字體

2)在源代碼模式下打開你的.plist文件...(注 - 不要打開info.plist

3)在此之前 - 右鍵單擊字體並在fontforge或類似的編輯器中打開它並將其install到您的系統中,它應該install

4)輸入這個

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5)在你的class .m這段代碼class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

這裡lblPoints將會隨著你的UILabel而改變

完成! 如果字體仍然不起作用,請首先檢查字體兼容性


是的,你可以包含自定義字體。 請參閱UIFont上的文檔,特別是fontWithName:size:方法。

1)確保你的資源文件夾中包含字體。

2)字體的“名稱”不一定是文件名。

3)確保您擁有使用該字體的合法權利。 通過將其包含在您的應用中,您也可以發布它,並且您需要有權這樣做。


有一種簡單的方法可以在iOS 4中使用自定義字體。

  1. 將您的字體文件(例如Chalkduster.ttf )添加到XCode中項目的資源文件夾中。
  2. 打開info.plist並添加一個名為UIAppFonts的新密鑰。 這個鍵的類型應該是數組。
  3. 將您的自定義字體名稱添加到此數組中,包括擴展名( Chalkduster.ttf )。
  4. 現在,您可以在應用程序中使用[UIFont fontWithName:@"Chalkduster" size:16]

不幸的是,IB不允許使用自定義字體來初始化標籤。 看到這個問題來解決這個問題。 我最喜歡的解決方案是使用自定義的UILabel子類:

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end

查找ATSApplicationFontsPath

一個簡單的plist條目,允許您將字體文件包含在應用程序資源文件夾中,並且它們在您的應用程序中“正常工作”。





fonts