iOS app内字体大小修改
2019-10-31 本文已影响0人
水煮杰尼龟
有些项目里面可能需要做app内部字体大小修改的功能,这分为俩种情况:1.项目1.0就有这需求, 2.项目后期要加这个需求。
正好近期做的项目有这个需求,而且是后者,后期版本才要加的。如果是项目开始就有这需求,可能你可以做一些基类,来处理全局的字体大小变化。自己也花了点时间研究了一些,参考了些,看了微信的字体大小切换就很流畅。字体大小的变化,最烦的可能就是UI的调整了。其实我自己项目里用的是最简单的方式,设置完字体重启app,而切换字体大小之后,我只是改变当前页面所有的字体大小(更简单的就是新画一个UI改变字体,改完再重启,我这种实际每次改动都修改了当前页面的字体,这就导致我还存了上次的字体大小,来处理用户调完字体大小但是最后取消的情况),嘿嘿。但是还是记录一些其他的处理吧
先放Demo吧
如果页面frame什么的不是自适应的话还是重启吧,不然太麻烦了。要做的话我感觉你得把所有已存在的界面UI都刷新一遍把,未出现的界面frame也得跟着font自适应。
我demo的做法也只是修改了字体,随便加了几个高度自适应的label而已,演示一下效果,提供一点思路。
首先看下demo用到的几个文件把(具体作用demo里都有注释)
demo文件- 首先设置字体的方法得包一层,这个应该基本做项目都会这样做。
在字体设置的方法里做一层自己的判断,本地存储的是什么大小的字体,就把font对应的大小调整一下,demo里是有4中字体大小。这里字体的调整也可以整几套对应的字体配置文件,根据不同的type去取对应的字体大小设置。我是懒得去配置了,直接加减了。 - 然后就是要去改变已存在的控件的字体了,demo用了2种方式,一种是
通知
,一种是将需要修改字体的控件暂存下来
。由于是后期项目新加的需求,我相信大部分人不会label啥的都用自定义的把。所以只能用runtime来做了。
这里我是交换了didMoveToSuperview
方法来添加控件或者通知,交换removeFromSuperview
来删掉控件或通知。具体可以去看UILabel+ChangeFont.m
。
放一点改变字体大小的代码吧,顺便做了一下富文本的判断。
//MARK: - 改变字体
-(void)switchLanguageFont{
if (self.isSetAttributedText) {
NSRange range1 = NSMakeRange(0, self.attributedText.string.length);
NSMutableAttributedString *mutString = [self.attributedText mutableCopy];
[mutString enumerateAttribute:NSFontAttributeName
inRange:range1
options:(NSAttributedStringEnumerationReverse) usingBlock:^(UIFont *value, NSRange range, BOOL * _Nonnull stop){
if (value) {
*stop = YES;
[mutString addAttribute:NSFontAttributeName value:[self getNewFontWithOld:value] range:range];
}else{
[mutString addAttribute:NSFontAttributeName value:[self getNewFontWithOld:self.font] range:range];
}
}];
self.attributedText = mutString;
}else{
self.font = [self getNewFontWithOld:self.font];
}
}
//MARK: - 通过老font 获取新font
-(UIFont *)getNewFontWithOld:(UIFont *)font{
NSString *preFont = [[NSUserDefaults standardUserDefaults]objectForKey:kPreLocalTextFont];
NSString *currentFont = [[NSUserDefaults standardUserDefaults]objectForKey:kLocalTextFont];
UIFont *oldFont = font;
CGFloat newfontSize = oldFont.pointSize + [currentFont integerValue] - [preFont integerValue];
NSString *fontName = oldFont.fontName;
return [UIFont fontWithName:fontName size:newfontSize];
}
-
存储了控件之后,当修改字体大小的时候,通过循环所有控件去修改字体大小。如果你不重启app的话,就需要你自己去刷新每个页面的布局。我用来修改单个界面字体的方法是遍历所有的视图来做的。
总而言之,重启是最简单的,不是必须的话,就重启吧。
最后放个demo图吧。(ps:这里只是提供一个方向,更多的还是根据自己的项目去修改适配优化吧)
changeFont.gif