iOS app内字体大小修改

  有些项目里面可能需要做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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。