美文网首页iOS大咖说
iOS app内字体大小修改

iOS app内字体大小修改

作者: 水煮杰尼龟 | 来源:发表于2019-10-31 17:35 被阅读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

    相关文章

      网友评论

        本文标题:iOS app内字体大小修改

        本文链接:https://www.haomeiwen.com/subject/zbngvctx.html