Подтвердить что ты не робот

Добавление пользовательских шрифтов в приложение iOS, нахождение их настоящих имен

У меня есть два шрифта для добавления в мое приложение для использования.

Вот изображения шрифтов. В настоящее время файлы называются

name.font       = [UIFont fontWithName:@"Helvetica Neue LT Pro-Medium" size:10];
headline.font   = [UIFont fontWithName:@"Helvetica Neue LT Pro-Light" size:8];

вставить те же имена в Font Avaliable option in plist file.

Я также попытался добавить имена файлов, например

HelveticaNeueLTPro-Lt
HelveticaNeueLTPro-Md

но ничего не работает. Как я могу получить точное имя шрифтов.

enter image description here

4b9b3361

Ответ 1

Используйте +[UIFont familyNames] чтобы получить список всех имен семейств шрифтов, известных системе. Для каждого семейного имени вы можете использовать +[UIFont fontNamesForFamilyName:] чтобы получить список всех имен шрифтов, известных системе. Попробуйте распечатать их, чтобы увидеть, какое имя ожидает система. Пример кода:

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

Поместите это в свое приложение, позвоните и посмотрите, что вы получите. Если вы видите имя в выводе, которое соответствует вашему шрифту, используйте его. В противном случае, возможно, вы неправильно добавили шрифт в свое приложение.

В быстром 4. 2+ используйте код, указанный ниже:

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

Ответ 2

Это шаг для добавления пользовательского шрифта в приложение.

1 - добавьте шрифт .TTF в ваше приложение
2 - Измените application-info.plist file.
3 - добавьте ключ "Шрифты, предоставленные приложением" , в новую строку
4 - и добавьте каждый .TTF файл (шрифта) в каждую строку.

Также читайте This и This учебные пособия для улучшения своих знаний.

ДЛЯ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ:

Но после добавления шрифта в ваше приложение иногда может быть имя шрифта не имя имени файла, поэтому вам нужно применить/написать реальное имя вашего шрифта, поэтому проверьте @NSGod ответ.

Ниже приведен код для поиска всех шрифтов из системы:

for(NSString *fontfamilyname in [UIFont familyNames])
{
    NSLog(@"Family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])
    {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"~~~~~~~~");
}

Возможно, выше шага и предложение полезно в вашем случае:

Ответ 3

Пока кажется, что метод UIFont fontNamed:size: довольно прощает имена, которые вы предоставляете, официальное fontName всегда было внутренним именем PostScript шрифта. Имя шрифта PostScript не может содержать пробелы и обычно заменяется на дефис. Я не помню, как это было сделано, но я считаю, что они также могут быть ограничены 31 символом.

Определение того, какое имя вы должны использовать в коде, чрезвычайно просто. Дважды щелкните по шрифту, который вы хотите использовать на устройстве iOS, чтобы открыть его в Книге шрифтов. Если шрифт еще не установлен, нажмите кнопку "Установить" в появившемся окне образца. Когда он установлен, выберите шрифт в списке шрифтов. В меню "Шрифтовая книга" выберите "Предварительный просмотр" > "Показать информацию о шрифте". Это покажет информацию о шрифте, как показано на рисунке ниже:

enter image description here

Как вы можете видеть, имя PostScript для Helvetica Neue LT Std 65 Medium равно HelveticaNeueLTStd-Md. Это имя, которое вы должны использовать в коде.

В вашем файле Info.plist, под шрифтами для приложения, вам нужно использовать фактическое имя файла самого шрифта, что бы это ни случилось. В моем случае это было HelveticaNeueLTStd-Md.otf.

Ответ 4

Более простой способ получить имя шрифта

  • Щелкните правой кнопкой мыши на файле .ttf/.otf и выберите "Получить информацию"
  • Прочитайте свойство Full Name и используйте это как имя шрифта

Он работает как в файле .plist(добавление расширения), так и в коде с [UIFont fontWithName:<Full Name> size:17]

Ответ 5

Just NSLog Шрифт, который вы хотите получить:

NSLog(@" %@", [UIFont fontNamesForFamilyName:@"American Typewriter"]);

И вы получите массив:

(
  "AmericanTypewriter-CondensedLight",
  "AmericanTypewriter-Light",
  "AmericanTypewriter-Bold",
  AmericanTypewriter,
  "AmericanTypewriter-CondensedBold",
  "AmericanTypewriter-Condensed"
)

Используйте любой код в коде любого имени шрифта AmericanTypewriter-Bold как [UIFont fontWithName:@"AmericanTypewriter-Bold" size:12.0]

Также вы можете получить все прикладные шрифты, сгруппированные по семейству шрифтов

for (NSString* family in [UIFont familyNames])
{
    NSLog(@"%@", family);

    for (NSString* name in [UIFont fontNamesForFamilyName: family])
    {
        NSLog(@"  %@", name);
    }
}

Ответ 6

Я пишу некоторый код, чтобы распечатать только имя шрифта, которое вы хотите, а не просто распечатать все шрифты.

- (NSString *)realNameOfFont:(NSString *)fullFontName {
    NSString *fontName = [[fullFontName componentsSeparatedByString:@"."] firstObject];
    NSString *ext = [fullFontName pathExtension];

    NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fontName ofType:ext]];
    if (data == nil) {
        NSLog(@"Failed to load font. Data at path %@ is null", fullFontName);
        return nil;
    }
    CFErrorRef errorRef;
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
    CGFontRef font = CGFontCreateWithDataProvider(provider);
    NSString *realFontName = (__bridge NSString *)CGFontCopyPostScriptName(font);
    if (!CTFontManagerRegisterGraphicsFont(font, &errorRef)) {
        NSError *error = (__bridge NSError *)errorRef;
        if (error.code != kCTFontManagerErrorAlreadyRegistered) {
            NSLog(@"Failed to load font: %@", error);
        }
    }
    NSLog(@"Real font name: %@", realFontName);
    CFRelease(font);
    CFRelease(provider);
    return realFontName;
}

Пример:

 NSArray *fonts = @[@"bg_en_AmaticSC-Bold111.otf", @"bg_en_segoescb_0.ttf", @"bg_en_UTM Cookies_2.ttf", @"bg_en_VSCOProximaExtrabold_0.otf"];
for (NSString *fontFullName in fonts) {
    [self realNameOfFont:fontFullName];
}

Результат:

Failed to load font. Data at path bg_en_AmaticSC-Bold111.otf is null
Real font name: SegoeScript-Bold
Real font name: UTM-Cookies
Real font name: ProximaNova-Extrabld

Ответ 7

Ничего плохого в других ответах. На самом деле требования iPatel продолжают применяться.

В Swift 2.2+ вызов, чтобы показать фамилии, просто:

  UIFont.familyNames().sort().forEach({ (familyName) in
            debugPrint(UIFont.fontNamesForFamilyName(familyName))
        })

Если вы установили шрифты в своей системе, вы также можете просто добавить шрифты к элементу пользовательского интерфейса в раскадровке.

Примечание

Однако я заметил ошибку в некоторых случаях, когда после правильного добавления шрифтов в проект, элементы info.plist и пользовательского интерфейса в раскадровке они по-прежнему неправильно отражают ваши желаемые изменения. В некоторых случаях переключение настроек поможет Storyboard синхронизировать его с xml. В других случаях вам может потребоваться просто обновить размер вашего пользовательского шрифта в коде, чтобы изменения вступили в силу. Самый простой метод в Swift, который я нашел, это:

@IBOutlet weak var startMessage: UILabel!
startMessage.font = UIFont(name: startMessage.font.familyName, size: 31.0)

Предполагается, что пользовательский шрифт уже установлен в раскадровке и просто обновляет размер в коде. Это обходное решение гарантирует, что, если будут выполнены все другие предварительные условия, вы фактически увидите правильный пользовательский шрифт. Он также устраняет необходимость знать базовое имя шрифта (хотя при желании исходный код Swift выше дает вам имя).

Ответ 8

Быстрая версия:

static func printAllFontNames() {
    for familyname in UIFont.familyNames() {
        for fname in UIFont.fontNamesForFamilyName(familyname) {
            print(fname)
        }
    }
}

Ответ 9

Версия Swift 3:

UIFont.familyNames.sorted().forEach({ (familyName) in
            print(UIFont.fontNames(forFamilyName: familyName))
        })

Ответ 10

Обновление для быстрого 3

for familyname in UIFont.familyNames {
            for fname in UIFont.fontNames(forFamilyName: familyname) {
                print(fname)
            }
        }

Ответ 11

Создать новое приложение с одним представлением

Создайте в приложении группу с именем "Шрифты", добавьте файлы шрифтов (отметьте галочкой "Копировать файлы", если необходимо).

В info.plist добавьте "Шрифты, предоставляемые приложением", добавьте каждый элемент для каждого шрифта, например, элемент 0: AlexBrush-Regular.ttf, элемент 1: Fipps-Regular.otf

Или отредактируйте info.plist напрямую:

<key>UIAppFonts</key>
<array>
    <string>AlexBrush-Regular.ttf</string>
    <string>Fipps-Regular.otf</string>
</array>

Вырежьте и вставьте этот код swift 5 в ViewController.swift, запустите симулятор, добавьте фильтр в журнал консоли, используя имя вашего шрифта

//
//  ViewController.swift
//  FontsApp
//
//  Created by Gary Davies on 28/3/19.
//  Copyright © 2019 Gary Davies. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    var fontFamilyNames: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        fontNames()
    }

    func fontNames() {
        getFontNames()
        sortFontNames()
        printFontName()
    }

    func getFontNames() {
        fontFamilyNames.removeAll()
        for name in UIFont.familyNames {
            fontFamilyNames.append(name)
        }
    }

    func sortFontNames() {
        let sorted = fontFamilyNames.sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending }
        fontFamilyNames.removeAll()
        for name in sorted {
            fontFamilyNames.append(name)
        }
    }

    func printFontName() {
        for name in fontFamilyNames {
            print(name, "=>", UIFont.fontNames(forFamilyName: name))
        }
    }
}

(Извините, это не дубликат, я добавил неправильный ответ на неправильный вопрос)