Вот упрощенный вариант версия моего текущего класса FontManager, который загружает и регистрирует шрифты из локального каталога приложения:
Код: Выделить всё
import Foundation
import CoreText
import CoreGraphics
import os.log
final class FontManager {
static let shared = FontManager()
private var registeredFonts: Set = []
private let logger = Logger(subsystem: "com.yourapp.FontManager", category: "FontManager")
private init() {
preloadRegisteredFonts()
}
func loadFont(from url: URL) -> Result {
guard url.isFileURL else {
logger.error("Invalid local URL: \(url.absoluteString)")
return .failure(.invalidLocalURL)
}
do {
let fontData = try Data(contentsOf: url)
if let postScriptName = registerFont(with: fontData) {
return .success(postScriptName)
} else {
return .failure(.fontRegistrationFailed)
}
} catch {
logger.error("Failed to read font data: \(error.localizedDescription)")
return .failure(.dataReadFailed)
}
}
private func registerFont(with fontData: Data) -> String? {
guard let dataProvider = CGDataProvider(data: fontData as CFData),
let cgFont = CGFont(dataProvider),
let postScriptName = cgFont.postScriptName as String? else {
logger.error("Failed to create CGFont")
return nil
}
if registeredFonts.contains(postScriptName) {
logger.info("Font already registered: \(postScriptName)")
return postScriptName
}
var error: Unmanaged?
if CTFontManagerRegisterGraphicsFont(cgFont, &error) {
registeredFonts.insert(postScriptName)
logger.info("Successfully registered font: \(postScriptName)")
return postScriptName
} else {
logger.error("Failed to register font: \(postScriptName)")
return nil
}
}
private func preloadRegisteredFonts() {
if let availableFonts = CTFontManagerCopyAvailablePostScriptNames() as? [String] {
registeredFonts = Set(availableFonts)
}
}
}
- Нужно ли регистрировать шрифты отдельно для виджета или можно повторно использовать шрифты, зарегистрированные в основном приложении?
- Если мне также нужно зарегистрировать шрифты для виджета, где мне следует это сделать в жизненном цикле виджета?
< li>Есть ли какие-либо особые соображения или ограничения при использовании пользовательских шрифтов, расположенных в локальном каталоге приложения, в виджетах?
Я надеялся, что шрифты, зарегистрированные в основном приложении, будут автоматически доступны в виджете без необходимости их повторной регистрации. Если это невозможно, я ожидал, что в жизненном цикле виджета будет метод или место для динамической регистрации этих шрифтов.
Я ищу наиболее эффективный способ обработки локальных пользовательских шрифтов. шрифты в расширении виджета.
Подробнее здесь: https://stackoverflow.com/questions/789 ... os-widgets
Мобильная версия