Как использовать пользовательские шрифты из каркаса, созданного в рабочей области XCode - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь инкапсулировать и организовать свой проект XCode для каждой функции.Чтобы добиться этого, я создаю проект Framework, встроенный в основной проект.Фреймворк содержит весь внешний вид приложения (с определением цвета и пользовательскими шрифтами).

Структура моего проекта примерно такая:

MainProject
    |_ Appearance.xcodeproj
    |       |_ ... 
    |       |_ Controller.swift
    |       |_ Resources
    |             |_ Font1.ttf
    |             |_ Font2.ttf
    |       |_ Products
    |             |_ Appearance.framework
    |_ ...

Идея состоит в том, чтобы компилировать Appearance.framework только один раз.и использовать встроенные пользовательские шрифты из основного проекта.Несмотря на то, что заголовки выставлены и нет ошибок компиляции, я получаю ошибки времени выполнения.

Контроллер в рамках использует UIFont(name: "Font1", size: 9)! Но, возвращаемое значение равно nil

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

Это правильный способ для внедрения такого рода фреймворков?Кто-нибудь может предложить решение для этой цели?У меня нет проблем с изменением моего подхода.

ОБНОВЛЕНИЕ 1:

Кроме того, я заметил, что среда создается в папке производных данных XCode.Есть шанс, что фреймворк можно сгенерировать в локальной папке, чтобы его можно было отслеживать в GIT?

1 Ответ

0 голосов
/ 13 августа 2019

Вот как вы регистрируете шрифты в памяти:

extension UIFont {
    private static func registerFont(withName name: String, fileExtension: String) {
        let frameworkBundle = Bundle(for: AnyClassFromFramework.self)
        let pathForResourceString = frameworkBundle.path(forResource: name, ofType: fileExtension)
        let fontData = NSData(contentsOfFile: pathForResourceString!)
        let dataProvider = CGDataProvider(data: fontData!)
        let fontRef = CGFont(dataProvider!)
        var errorRef: Unmanaged<CFError>? = nil

        if (CTFontManagerRegisterGraphicsFont(fontRef!, &errorRef) == false) {
            print("Error registering font")
        }
    }

    public static func loadFonts() {
        registerFont(withName: "Font1", fileExtension: "ttf")
        registerFont(withName: "Font2", fileExtension: "ttf")
    }
}

Вызовите UIFont.loadFonts() в AppDelegate.swift.

После этого вы сможете создать UIFont(name: "Font1", size: 17).

...