Làm cách nào để lấy tên phông chữ từ tệp otf hoặc ttf?


83

Tôi đã sử dụng phông chữ tùy chỉnh trong ứng dụng trước đây của mình.

Tên tệp là "ProximaNova-Regular.otf" và để tải phông chữ tôi vừa sử dụng ...

[UIFont fontWithName:@"ProximaNova-Regular" size:20];

Điều này đã hoạt động hoàn hảo.

Bây giờ trong ứng dụng mới này, tôi có ba tệp phông chữ ...

Dude_Willie.otf
Impact
handsean.ttf

Nhưng tôi không chắc làm thế nào để tải những thứ này.

Tôi đã thử

[UIFont fontWithName:<the file name> size:20];

Nhưng điều này chỉ rơi vào việc sử dụng Helvetica.

Làm thế nào tôi có thể tìm thấy tên để sử dụng?


Có gì sai với cách tiếp cận được liệt kê trong câu hỏi liên quan đầu tiên?
borrrden


"Có gì sai với câu hỏi trùng lặp đầu tiên?" nó không cho tôi biết bất cứ điều gì. Tôi đã in ra [UIFont familyNames] và không có cái nào liên quan đến phông chữ của tôi.
Fogmeister

1
Sau đó, phông chữ của bạn không được cài đặt đúng cách
borrrden

Gah! Tôi chưa thêm chúng vào info.plist ...
Fogmeister

Câu trả lời:


85

Làm theo bốn bước đơn giản sau để thêm và sử dụng phông chữ mới trong ứng dụng iOS của bạn:

  • Thêm your_new_font.ttf hoặc your_new_font.otf vào dự án Xcode của bạn
  • Trong info.plist của dự án, hãy thêm một mục nhập mới cho your_new_font.ttf hoặc your_new_font.otf vào UIAppFontsmảng (văn bản thuần túy cho mục này là 'Phông chữ do ứng dụng cung cấp')
  • Tại thời điểm này, tôi khuyên bạn nên thêm đoạn mã gỡ lỗi tạm thời này để kết xuất tất cả các phông chữ mà ứng dụng của bạn có thể truy cập, bao gồm your_new_font mới được thêm vào:

//Nhanh

    for family: String in UIFont.familyNames {
        print("\(family)")
        for names: String in UIFont.fontNames(forFamilyName: family) {
            print("== \(names)")
        }
    }

// Mục tiêu-c

for(NSString *fontfamilyname in [UIFont familyNames]) {
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname]) {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
  • Trong đầu ra gỡ lỗi, hãy tìm tên 'họ' và 'phông chữ' mới của bạn. Chuyển bất cứ thứ gì được hiển thị dưới dạng tên 'phông chữ' tương ứng với họ phông chữ mới của bạn (có thể có nhiều hơn một 'phông chữ' được liên kết với 'họ' phông chữ mới của bạn) đến UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20]và bạn nên kinh doanh!

2
Cảm ơn, bạn đã cứu một ngày của tôi
Yahya Alshaar

123

Nhấp chuột phải vào TTF -> Nhận thông tin

"Tên đầy đủ" là những gì bạn đang tìm kiếm.

Đó là những gì đã làm việc cho tôi với TTFs.

Biên tập:

Tôi vừa sử dụng phông chữ có tên khác với "Tên đầy đủ" trong Nhận thông tin.

Để biên dịch câu trả lời này, Nếu kiểm tra nhanh ở trên không hoạt động, hãy chạy mã này trong dự án của bạn:

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

Và tìm kiếm tên chính xác của phông chữ bạn muốn sử dụng.

Mã Swift 3.0:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}

Nó thực sự phụ thuộc vào nhà sản xuất phông chữ. Chúng tôi có một số phông chữ kinh khủng mà chúng tôi nhận được từ một khách hàng và tên phông chữ rất tùy ý khi chúng được iOS sử dụng. Tôi vừa thử phương pháp này với một trong các phông chữ của chúng tôi và nó không thành công.
borrrden

@borrrden cho đến nay phương pháp này hiệu quả với tôi mọi lúc. Tôi chưa bao giờ tự tạo một phông chữ nên bạn có thể đúng, tôi không biết.
Segev

Nó rất có thể sẽ hoạt động đối với các phông chữ được làm tốt. Các phông chữ chúng tôi nhận được đã được tạo ra khoảng 2 thập kỷ trước (nó thật tệ ...). Tuy nhiên, cách duy nhất để chắc chắn là hỏi hệ thống.
borrrden

3
Cảm ơn, điều này đã hoạt động sau khi tôi đã cài đặt đúng các phông chữ trong tệp info.plist.
Fogmeister

6
Điều này không hoạt động cho tất cả các phông chữ. Ví dụ, "Họ và tên" giá trị được hiển thị như "Proxima Nova Thường xuyên" khi gia đình trong mã là "ProximaNova-Regular"
rrbrambley

58
  • Cài đặt phông chữ
  • Mở ứng dụng Font Book trên máy Mac của bạn
  • Chọn phông chữ và nhấp vào nút 'thông tin'
  • Tên bạn đang tìm là tên PostScript
    • MacOS: Xem -> Hiển thị Thông tin Phông chữ

thí dụ


5
có vẻ như cách đơn giản nhất
Eyal Alsheich

6
fwiw, tôi cần vào View> Show Font Info để xem chi tiết. Không chắc tại sao nó bị tắt theo mặc định trên máy của tôi.
Mark Robson

41

Để sử dụng phông chữ trong iOS, bạn phải tải phông chữ dựa trên TÊN ĐẦY ĐỦ (PostScript Name) của phông chữ , đôi khi (và thường là) khác với TÊN FILE thực của phông chữ .

Hãy tưởng tượng bạn đổi tên tệp Phông chữ "Arial-regular.ttf" thành "foo.ttf". Phông chữ có bên trong tệp phông chữ bạn vừa đổi tên vẫn là "Arial-normal".

Có một số cách lập trình tốt để lấy tên phông chữ đã có trên chủ đề này, nhưng tôi có một cách tiếp cận khác bằng cách sử dụng dòng lệnh.

Nếu bạn đang sử dụng Mac hoặc Linux, chỉ cần chạy tập lệnh này từ dòng lệnh trong thư mục nơi bạn có phông chữ tùy chỉnh của mình (sử dụng fc-scantiện ích từ fontconfig đã được cài đặt sẵn, nhưng nếu không, bạn có thể cài đặt nó qua homebrew brew install fontconfig:):

for file in "$arg"*.{ttf,otf}; do fc-scan --format "%{postscriptname}\n" $file; done

Đây là ảnh chụp màn hình của lệnh trên đang chạy trên ~/Library/Fontsthư mục của tôi :

nhập mô tả hình ảnh ở đây

Tập lệnh trên sẽ chạy qua tất cả các tệp .ttf.otftrong thư mục hiện tại, sau đó in ra Tên PostScript cho mỗi phông chữ mà bạn có thể sử dụng để tham chiếu tệp phông chữ trong XCode hoặc ở nơi khác.

Nếu bạn muốn làm quen với một số thông tin bổ sung (PostScriptName, Filename) và một số mã màu, bạn có thể chạy tập lệnh thay thế này:

for file in "$arg"*.{ttf,otf}; do 
    postscriptname=$(fc-scan --format "%{postscriptname}\n" $file);
    printf "\033[36m PostScript Name:\033[0m %s \e[90m(%s)\033[0m\n" "$postscriptname" "$file";
done

nhập mô tả hình ảnh ở đây

Cách này nhanh hơn một chút so với việc sao chép mã bên trong tệp AppDelegate.m của bạn để in ra tên mỗi khi bạn muốn thêm tệp phông chữ mới, đây là phương pháp phổ biến và cũng nhanh hơn so với việc mở Phông chữ trong FontBook để kiểm tra Tên PostScript.

MẸO HỮU ÍCH: Nếu bạn đặt bí danh tập lệnh trên trong thiết bị đầu cuối của mình thì tất cả những gì bạn cần làm là nhập một lệnh duy nhất để lấy tất cả các tên phông chữ PostScript cho tất cả các tệp trong thư mục hiện tại (hàm của tôi được gọi fontnamesnên tất cả những gì tôi phải làm là loạifontnames vào đầu cuối bên trong thư mục với các phông chữ trong đó và tên PostScript sẽ được in tự động, sau đó bạn sẽ tiết kiệm thời gian trong quy trình phát triển của mình và có sẵn tập lệnh tiện dụng này để sử dụng khi bạn cần.

Hi vọng điêu nay co ich!


Tôi đang sử dụng Mac. Tôi đã tải xuống fontConfig từ liên kết mà bạn cung cấp. Nhưng nó có rất nhiều tệp trong đó. Làm cách nào để sử dụng nó hoặc cài đặt fontConfig vào máy mac của tôi.
Sujay UN

@SujayUN Nếu bạn đang sử dụng máy Mac, bạn có thể đã fc-scancài đặt tiện ích này. Điều gì xảy ra khi bạn chạy fc-scan -Vtrên thiết bị đầu cuối?
radiovisual

3
Bạn cũng có thể cài đặt Fontconfig qua homebrew : brew install fontconfig.
radiovisual

Tôi có được điều này khi tôi chạy ur cmd -bash: không tìm thấy lệnh: fc-scan
Sujay LHQ

Được, tôi khuyên bạn nên cài đặt qua Homebrew nếu bạn chưa cài đặt nó trên máy của mình. Xem liên kết đến Homebrew và lệnh cài đặt trong nhận xét của tôi ở trên.
radiovisual

6

Bạn muốn biết cách đặt tên cho điều này: -

  NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];

  for (NSInteger indFamily=0; indFamily<[familyNames count]; ++indFamily) 
  {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);

        NSArray *fontNames = [[NSArray alloc] initWithArray:
              [UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];

        for (NSInteger indFont=0; indFont<[fontNames count]; ++indFont) 
        {
              NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
  }

hy vọng nó sẽ giúp bạn ...


6

Nếu bạn muốn tìm tên phông chữ cho một tệp phông chữ nhất định theo chương trình:

import Foundation

func loadFontName(for file: URL) throws -> String {
    let data = try Data(contentsOf: file)

    guard let provider = CGDataProvider(data: data as CFData) else {
        throw Error("Could not create data provider")
    }

    guard let font = CGFont(provider) else {
        throw Error("Could not load font")
    }

    guard let name = font.postScriptName else {
        throw Error("Could not get font name from font file")
    }

    return name as String
}

Thay thế bằng các Errorđồ vật có thể ném của riêng bạn theo yêu cầu.


5

Swift 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }

5

Giải pháp Swift 4.0+

    for fontFamilyName in UIFont.familyNames {
        print("family: \(fontFamilyName)\n")

        for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
            print("font: \(fontName)")
        }
    }

Sẽ xuất:

gia đình: Apple SD Gothic Neo

phông chữ: AppleSDGothicNeo-Thin

phông chữ: AppleSDGothicNeo-Light


4

Sau khi bạn đã thêm phông chữ vào dự án / ứng dụng của mình, hãy thêm mã này (có thể chỉ trong phương thức didFinishLaunchingWithOptions của ứng dụng ủy quyền) để in ra tất cả các phông chữ có sẵn cho ứng dụng của bạn. Từ trong danh sách đó, bạn sẽ có thể xác định được phông chữ bạn đang theo đuổi. Đừng quên xóa mã không cần thiết sau.

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

3

Bạn cũng có thể sử dụng otfinfo --info arial.ttf để lấy tên từ dòng lệnh. Tên tái bút là tên bạn cần chuyển cho hàm tạo UIFont.


3

Swift 1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }

2

Một thủ thuật "nhanh chóng, thiết thực" khác không liên quan đến việc quét qua tất cả các phông chữ mặc định tồn tại trên trình giả lập hoặc thiết bị là sử dụng phông chữ cho thứ gì đó trong của bạn storyboard. Sau đó, nếu bạn chỉnh sửa bảng phân cảnh bằng trình chỉnh sửa văn bản (mở dưới dạng source code), bạn có thể thấy các phông chữ được sử dụng với tên "nội bộ" nếu bạn tìm kiếm thẻ "customFonts":

<customFonts key="customFonts">
    <array key="Linotype - AvenirNextLTPro-Bold.otf">
        <string>AvenirNextLTPro-Bold</string>
    </array>
    <array key="Linotype - AvenirNextLTPro-Regular.otf">
        <string>AvenirNextLTPro-Regular</string>
    </array>
    <array key="TradeGothicLTPro-BdCn20.otf">
        <string>TradeGothicLTPro-BdCn20</string>
    </array>
</customFonts>

1

Đăng nhập familyName của tệp phông chữ và sau đó truy cập các phông chữ:

// You can log all font family names suing **fontNamesForFamilyName**

NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);

Hy vọng nó sẽ giúp bạn.


Không có vẻ làm việc cho chúng tôi - Nếu Tên file khác với tên font gia đình nó không thành công
Blitz

Bạn nên lấy tên phông chữ trong phần lấy thông tin.
Nishant Tyagi

0

Liệt kê tên và họ phông chữ cho macOS với Swift 4.1 :

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }

-2

Swift 4.0 được hỗ trợ

Đây chỉ là một mã dòng để in tất cả họ phông chữ và đó là tên của phông chữ

override func viewDidLoad() {
    super.viewDidLoad()
    //Main line of code
    UIFont.familyNames.sorted().forEach({ print($0); UIFont.fontNames(forFamilyName: $0 as String).forEach({print($0)})})
}

Đọc câu hỏi.
Fogmeister

@Fogmeister câu trả lời chấp nhận của bạn là tương tự như thế này đó là lý do tôi viết mã này theo cách ngắn hơn ..
NiravS

Dòng này đọc ttf hoặc tập tin OTF và sau đó cung cấp cho họ phông chữ và đó là tất cả tên phông chữ .. @Fogmeister
NiravS

Nếu câu trả lời được chấp nhận giống với câu trả lời của bạn ... tại sao bạn lại viết câu trả lời này? Chỉ cần chỉnh sửa cái đã tồn tại (Đó là những gì nút chỉnh sửa dành cho). Đừng cố ăn cắp điểm đại diện của người khác bằng cách sao chép, dán câu trả lời của họ cho những thay đổi nhỏ, không đáng kể. Bây giờ tôi đã thay đổi câu hỏi được chấp nhận thành một câu hỏi gần đây hơn cho thấy cách cài đặt phông chữ đúng cách. Cảm ơn
Fogmeister

Ngoài ra, câu trả lời của bạn là "chỉ một dòng mã" nhưng nó khá khó đọc. Tôi muốn một câu trả lời có nhiều dòng có thể dễ dàng được quét qua để xem nó đang làm gì.
Fogmeister
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.