Быстрое извлечение символов из шрифта по имени - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь выполнить глифы с фронта SF Symbol, используя приведенный ниже пример кода, предоставленный извлечением https://github.com/davedelong/sfsymbols. Я выделил код, который не могу использовать для работы со значениями, извлеченными из времени выполнения.

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

Похоже, что эта проблема является именем, которое я предоставляю последнему утверждению в CTFontGetGlyphWithName. Каждая комбинация значений, которые я попытался, возвращает 0.

Обратите внимание, что у вас должно быть приложение SF Symbolsустановлен для получения исходного пакета.

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

спасибо.

Я выполнил довольно много обучающих упражнений, но, похоже, практических примеров этих более продвинутых функций не так много.

public class StackOverflow {

    public func Test() {
        let maybeCFURLs = LSCopyApplicationURLsForBundleIdentifier("com.apple.SFSymbols" as CFString, nil)?.takeRetainedValue()

        let cfURLs = maybeCFURLs as? Array<URL>

        let fontFile = cfURLs!.compactMap { url -> URL? in
            guard let appBundle = Bundle(url: url) else { return nil }
            return appBundle.url(forResource: "SFSymbolsFallback", withExtension: "ttf")
        }

        let attributes = [
            kCTFontTraitsAttribute: [
                kCTFontWeightTrait: NSFont.Weight.regular.rawValue
            ]
        ]

        let provider = CGDataProvider(url: fontFile.first! as CFURL)
        let cgFont = CGFont(provider!)

        let ctAttributes = CTFontDescriptorCreateWithAttributes(attributes as CFDictionary)
        let font = CTFontCreateWithGraphicsFont(cgFont!, 32, nil, ctAttributes)

        // let name = "uni.plus.square.fill.medium" as CFString - Does not work
        //var name = "square.fill.medium" as CFString - Does not work
        let glyphName = "plus.square.fill.medium" as CFString

        var glyph = CTFontGetGlyphWithName(font, glyphName )
    }
}
...