я думал, что я разделю свой ответ как Что ж. Мой проект настроен следующим образом:
Главная IOS App (Swift)
Dynamic Framework (Obj-C)
App Классы (ViewControllers, Модели, CoreData, и т.д ...)
Моя цель состояла в том, чтобы быть способный заставить основное приложение вызвать один метод в динамической структуре для загрузки шрифтов без необходимости изменения Info.plist или добавления файлов/расслоение на главную цель.
@import CoreText;
@implementation NSBundle (Fonts)
+ (NSBundle *)fontsBundle {
// The only way I could find to do this is to hard code the sub-path. Using pathForResource doesn't seem to find Fonts.bundle, nor its contents\
// This way the host app doesn't need to copy Fonts.bundle
NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/Frameworks/<YourFrameworkName>.framework/Fonts.bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
if (bundle == nil) {
NSLog(@"Warning: Fonts.bundle could not be loaded. Have you included it in your target?");
}
return bundle;
}
- (BOOL)loadFonts {
NSArray<NSString *> *names = @[
@"GothamRnd-Bold",
@"GothamRnd-BoldItal",
@"GothamRnd-Book",
@"GothamRnd-BookItal",
@"GothamRnd-Light",
@"GothamRnd-LightItal",
@"GothamRnd-MedItal",
@"GothamRnd-Medium",
];
__block NSInteger failCounter = 0;
[names enumerateObjectsUsingBlock:^(id _Nonnull name, NSUInteger idx, BOOL *_Nonnull stop) {
NSString *fontPath = [self pathForResource:name ofType:@"otf"];
NSData *inData = [NSData dataWithContentsOfFile:fontPath];
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (!CTFontManagerRegisterGraphicsFont(font, &error)) {
if (error) {
NSLog(@"Failed to load font at path: %@", fontPath);
failCounter++;
}
CFStringRef errorDescription = CFErrorCopyDescription(error);
NSLog(@"Failed to load font: %@", errorDescription);
CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);
}];
return failCounter == 0;
}
@end
Единственный облом в этом коде, вы должны жестко закодировать путь к Fonts.bundle. Я не мог получить какую-либо комбинацию методов NSBundle для автоматического поиска файла Fonts.bundle.Например никаких методов, как это не будет возвращать путь:
NSString *pathToBundle = [[NSBundle mainBundle] pathForResource:@"Fonts" ofType:@"bundle"];
NSString *pathToFont = [[NSBundle mainBundle] pathForResource:@"MyFont" ofType:@"ttf"];
Помимо жесткого кодирования (который никогда не изменится), это работает для меня достаточно хорошо, хотя. Теперь я могу легко скрыть все мои клиентские приложения.
Пробовал ли вы метод в моем ответе? Я использую его в нескольких приложениях, которые используют пользовательские шрифты в комплекте с динамической структурой без необходимости добавления шрифтов в основной проект. –