目前我能想到的修改字體大小的方法有兩種情況:
- 要么全體統(tǒng)一修改春叫,可以在展示控件如UILabel 直接加category重寫方法或自定義方法肩钠,使用runtime動態(tài)修改,這種方式不僅可以修改字體大小暂殖,還可以修改字體樣式价匠。
- 或者是通過為UIFontDescriptor添加category方法實現(xiàn)動態(tài)改變指定控件(如UILabel UIButtonLabel等)的字體大小。
下面我介紹的就是第二種通過UIFontDescriptor的修改
項目截圖
- 無法查看請點這個 gif圖鏈接
方法介紹
- UIFontDescriptor+JHFontDescriptor.h 核心字體設置類呛每,通過category為UIFontDescriptor添加下列幾種方法
+ (UIFontDescriptor *)JH_preferredFontDescriptorWithTextStyle:(UIFontTextStyle)style contentString:(NSString *)contentString;
+ (UIFontDescriptor *)JH_preferredBoldFontDescriptorWithTextStyle:(UIFontTextStyle)style contentString:(NSString *)contentString;
+ (UIFontDescriptor *)JH_fontDescriptorWithSymbolicTraits:(UIFontDescriptorSymbolicTraits)symbolicTraits textStyle:(UIFontTextStyle)style contentString:(NSString *)contentString;
- 方法的一部分實現(xiàn)為
static dispatch_once_t onceToken;
static NSDictionary *fontSizeDict;
dispatch_once(&onceToken, ^{
fontSizeDict = @{
UIFontTextStyleHeadline: @{
UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @26,
UIContentSizeCategoryAccessibilityExtraExtraLarge: @25,
UIContentSizeCategoryAccessibilityExtraLarge: @24,
UIContentSizeCategoryAccessibilityLarge: @24,
UIContentSizeCategoryAccessibilityMedium: @23,
UIContentSizeCategoryExtraExtraExtraLarge: @23,
UIContentSizeCategoryExtraExtraLarge: @22,
UIContentSizeCategoryExtraLarge: @21,
UIContentSizeCategoryLarge: @20,
UIContentSizeCategoryMedium: @19,
UIContentSizeCategorySmall: @18,
UIContentSizeCategoryExtraSmall: @17,},
定義一個字典來重新儲存需要修改的字體大小踩窖,UIFontTextStyleHeadline等等幾種文字的類型就不具體介紹了。
- JHDynamicFontManager字體管理類
+ (instancetype)defaultManager
{
static JHDynamicFontManager *manager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[self alloc] init];
[manager registerDynamicFontNotification];
});
return manager;
}
#pragma mark 添加通知觀察者
- (void)registerDynamicFontNotification
{
//當不同類別的字體大小發(fā)生變化時接收通知
//// userInfo dictionary will contain new value for UIContentSizeCategoryNewValueKey
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedFontSizeChanged:) name:UIContentSizeCategoryDidChangeNotification object:nil];
}
添加通知觀察者晨横,當有字體修改會受到通知洋腮,并將通知傳遞給我們自己已經(jīng)定義好的通知
#pragma mark 收到并傳遞通知
- (void)receivedFontSizeChanged:(NSNotification *)notification
{
// NSString instance with new content size category in userInfo
NSDictionary *dict = notification.userInfo;
[self postDynamicFontNotificationWithContentSizeStr:dict[UIContentSizeCategoryNewValueKey]];
}
#pragma mark 發(fā)送
- (void)postDynamicFontNotificationWithContentSizeStr:(NSString *)contentSizeStr
{
[[NSNotificationCenter defaultCenter] postNotificationName:JHFontDidChangeNotification object:nil userInfo:@{JHFontSizeCategoryNewValueKey:contentSizeStr}];
}
- ViewController demo控制器
在viewdidload里面注冊通知觀察者,并在receivedFontSizeChanged方法里面對受到的通知消息進行處理,我更改的是一行文字的展示效果textLabel是“這一行就是讓你看看效果J中巍I豆!”库糠,截圖如下伙狐,gif圖gif
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedFontSizeChanged:) name:JHFontDidChangeNotification object:nil];
- (void)receivedFontSizeChanged:(NSNotification *)notification
{
// NSString instance with new content size category in userInfo
NSDictionary *dict = notification.userInfo;
NSString *contentSizeStr = dict[JHFontSizeCategoryNewValueKey];
UIFontDescriptor *descriptor = [UIFontDescriptor JH_preferredFontDescriptorWithTextStyle:UIFontTextStyleBody contentString:contentSizeStr];
_textLabel.font = [UIFont fontWithDescriptor:descriptor size:0.0];
}
- JHSliderView 滑塊的實現(xiàn)類,可以調(diào)整字體選項的個數(shù)瞬欧。需要的可以直接查看源碼贷屎。
喜歡的可以在git上面給個star謝謝!K一ⅰ唉侄!