This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.
2021-04-02 02:24:13 +03:00

62 lines
1.6 KiB
Objective-C

// Copyright 2018-present 650 Industries. All rights reserved.
#import <EXFont/EXFontScalersManager.h>
#import <UMCore/UMDefines.h>
#import <EXFont/EXFont.h>
#import <objc/runtime.h>
static NSPointerArray *currentFontScalers;
@implementation UIFont (EXFontLoader)
- (UIFont *)EXFontWithSize:(CGFloat)fontSize
{
for (id<UMFontScalerInterface> fontScaler in currentFontScalers) {
UIFont *scaledFont = [fontScaler scaledFont:self toSize:fontSize];
if (scaledFont) {
return scaledFont;
}
}
return [self EXFontWithSize:fontSize];
}
@end
/**
* A singleton module responsible for overriding UIFont's
* fontWithSize: method which is used for scaling fonts.
* We need this one, central place to store the scalers
* as for now to get rid of timing problems when backgrounding/
* foregrounding apps.
*/
@implementation EXFontScalersManager
UM_REGISTER_SINGLETON_MODULE(FontScalersManager);
+ (void)initialize
{
static dispatch_once_t initializeCurrentFontScalersOnce;
dispatch_once(&initializeCurrentFontScalersOnce, ^{
currentFontScalers = [NSPointerArray weakObjectsPointerArray];
Class uiFont = [UIFont class];
SEL uiUpdate = @selector(fontWithSize:);
SEL exUpdate = @selector(EXFontWithSize:);
method_exchangeImplementations(class_getInstanceMethod(uiFont, uiUpdate),
class_getInstanceMethod(uiFont, exUpdate));
});
}
- (void)registerFontScaler:(id<UMFontScalerInterface>)fontScaler
{
[currentFontScalers compact];
[currentFontScalers addPointer:(__bridge void * _Nullable)(fontScaler)];
}
@end